Помню, когда я только начинал использовать WordPress, я подключался к базе данных напрямую, то есть коннектился через mysql_connect() и всё такое, ну и нубство 🙂
Итак, приступим.
Перед тем, как использовать любой из перечисленных ниже методов, необходимо глобализовать $wpdb.
global $wpdb; |
Произвольный SQL-запрос
$wpdb->query('query'); |
Проще простого, ведь так? А теперь Пример 1:
$wpdb->query( " DELETE FROM $wpdb->posts WHERE post_type = 'revision' " ); // удаляем все ревизии постов |
Пример 2.
используйте $wpdb->prepare, чтобы защититься от SQL-инъекций:
$id = 15; $key = "first_name"; $value = "Михаил"; $wpdb->query( $wpdb->prepare( " INSERT INTO $wpdb->usermeta ( user_id, meta_key, meta_value ) VALUES ( %d, %s, %s ) ", $id, $key, $value ) ); // %s значит строка, %d - значит число // добавляем имя пользователю с ID=15 |
Пример 3.
также в качестве второго параметра можно использовать и массив:
$wpdb->query( $wpdb->prepare( " INSERT INTO $wpdb->usermeta ( user_id, meta_key, meta_value ) VALUES ( %d, %s, %s ) ", array( $id, $key, $value ) ) ); |
Обращение к таблицам MySQL, префикс таблиц
Обратиться к стандартным таблицам в базе WordPress очень легко — ведь для этого предназначены переменные класса:
- $commentmeta
- $comments
- $links
- $options
- $postmeta
- $posts
- $terms
- $term_relationships
- $term_taxonomy
- $usermeta
- $users
Как это будет выглядеть на деле:
$wpdb->query("DELETE FROM $wpdb->posts WHERE id = '1'"); |
Ок, а как быть с таблицами плагинов, или теми, которые сами мы и создали?
$wpdb->query("DELETE FROM ".$wpdb->prefix."posts WHERE id='1'") |
Как использовать SELECT?
На этот случай в WordPress существует аж четыре метода (функции). По-прежнему не хочу загружать вас лишней болтовней, поэтому сразу перехожу к делу.
1. get_results
Первый метод больше всего похож на обычный запрос SELECT.
$wpdb->get_results('query', output_type); |
- output_type — тип вывода данных
- OBJECT — объект (по умолчанию),
- OBJECT_K — ассоциативный массив, в котором в качестве ключей будут использоваться значения в первой колонке, дубликаты будут проигнорированы,
- ARRAY_A — нумерованный массив состоящий из ассоциативных массивов, в качестве индексов которых будут использоваться названия колонок,
- ARRAY_N — нумерованный двумерный массив;
Пример 1.
выводим заголовки всех опубликованных страниц:
$pages = $wpdb->get_results( " SELECT post_title, post_content FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'page' " ); /* вытаскивает из базы данных заголовки и содержимое всех опубликованных страниц */ if( $pages ) { foreach ( $pages as $page ) { echo $page->post_title; } } // выводим заголовки |
Пример 2.
пример с использованием функции setup_postdata, то есть в итоге получается некий аналог WP_Query().
$pages = $wpdb->get_results( " SELECT * FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'page' " ); if ( $pages ) { foreach ( $pages as $post ) { setup_postdata( $post ); ?> <h1> <a href="<?php the_permalink(); ?>"> <?php the_title(); ?> </a> </h1> <?php } else { ?> <h1>Ничего не найдено</h1> <?php } } /* В случае если на блоге есть опубликованные страницы, выводим заголовок со ссылкой на саму страницу */ |
2. get_var
Переходим ко второму методу, get_var, в отличие от get_results, он позволяет вывести одно значение, причем это может быть сумма значений или количество строк.
$wpdb->get_var('query',column_offset,row_offset); |
- column_offset — (целое) номер по порядку нужной колонки (по умолчанию 0)
- row_offset — (целое) номер по порядку нужного ряда (по умолчанию 0)
Пример первый.
выводим дату регистрации какого-то конкретного пользователя:
$date = $wpdb->get_var( " SELECT user_registered FROM $wpdb->users WHERE user_login = 'truemisha' " ); echo $date; /* узнаем и выводим дату регистрации пользователя с логином truemisha */ |
Пример второй.
пришло время узнать количество зарегистрированных пользователей на нашем блоге:
$number_of_users = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->users;" ); echo "Всего на сайте зарегалось {$number_of_users} человек."; |
Пример третий
подсчитаем сумму чего-нибудь из метаданных пользователя:
$amount = $wpdb->get_var( $wpdb->prepare( " SELECT sum(meta_value) FROM $wpdb->usermeta WHERE meta_key = %s ", $meta_key ) ); echo "Сумма равна {$amount}"; |
3. get_row
Получает значения только из одной строки, удовлетворяющей условию.
$wpdb->get_row('query', output_type, row_offset); |
- output_type — тип вывода данных,
- OBJECT — объект (по умолчанию),
- ARRAY_A — ассоциативный массив,
- ARRAY_N — нумерованный массив;
- row_offset — (целое) номер по порядку нужного ряда (по умолчанию 0)
Пример 1.
выводим заголовок поста с самым большим количеством комментариев:
$post = $wpdb->get_row( " SELECT post_title, post_content FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY comment_count DESC LIMIT 0,1 " ); echo $post->title; |
Пример 2.
используем для тех же целей ассоциативный массив:
$post = $wpdb->get_row( " SELECT post_title, post_content FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY comment_count DESC LIMIT 0,1 ", ARRAY_A ); echo $post['title']; |
4. get_col
Вывод данных только из одной колонки, в результате получаем одномерный объект.
$wpdb->get_col('query',column_offset); |
- column_offset — (целое) номер по порядку нужной колонки (по умолчанию 0)
Пример:
выводим заголовок самой первой опубликованной страницы:
$posts = $wpdb->get_col( " SELECT post_title FROM $wpdb->posts WHERE post_status = 'publish' AND post_type='page' " ); echo $posts[0]; |
INSERT
Предназначен для вставки строки в таблицу. Сразу перейду к примеру, потому что в синтаксисе на первый взгляд будет мало чего понятно.
$wpdb->insert( $wpdb->prefix . 'usermeta', // указываем таблицу array( // 'название_колонки' => 'значение' 'user_id' => 1, 'meta_key' => 'first_name', 'meta_value' => 'Михаил' ), array( '%d', // %d - значит число '%s', // %s - значит строка '%s' ) ); |
UPDATE
Предположим в прошлом примере мы всё-таки создали строку и сейчас хотим её обновить:
$wpdb->update( $wpdb->prefix . 'usermeta', // указываем таблицу array('meta_value' => 'Миша'), // поменяем имя array( // где 'user_id' => 1, 'meta_key' => 'first_name' ), array( '%s' ), array( // формат для «где» '%d', '%s' ) ); |
Источник: misha.blog