Взаимодействие с базой данных является одним из ключевых моментов работы практически любого современного сайта. Популярные движки в ряде случаев имеют встроенные API для работы с таблицами, и WordPress не стал исключением. Данная возможность позволяет разработчикам значительно расширять функциональность сайта, и использовать таблицы в базе более гибко.
Перед тем, как выполнять запросы в базу данных, необходимо первоначально к ней подключиться. В случае использования WordPress для нас становится доступна переменная $wpdb — она уже содержит объект класса, методы которого позволяют работать с таблицами в базе данных.
Перед использованием класса, необходимо глобализовать переменную $wpdb.
global $wpdb;
Использование метода query()
Чтобы выполнить определённый запрос, мы можем воспользоваться методом query():
$wpdb->query("DELETE FROM $wpdb->posts WHERE post_type = 'draft'"); // затираем все черновики
Довольно простой пример, в котором содержатся все параметры для его выполнения. Этот метод довольно безопасный, ровно до того момента, пока дело не доходит до передачи каких-либо параметров в запросе. Тут появляется необходимость экранирования переменных от SQL-инъекций, чтобы обезопасить данные он несанкционированных манипуляций. Для этих целей удобно использовать метод prepare() совместно с методом query().
Использование метода prepare()
В данном примере мы добавим имя для пользователя, у которого ID равен 10. Здесь наглядно показан пример экранирования данных. Особенность этого примера в том, что каждая переменная передаётся через запятую, в соответствующем порядке как указано в запросе.
$id = 10; $key = "first_name"; $value = "John"; // %s сообщает, что ожидается строка, %d – число $wpdb->query( $wpdb->prepare( "INSERT INTO $wpdb->usermeta ( user_id, meta_key, meta_value ) VALUES ( %d, %s, %s )", $id, $key, $value ));
Это довольно простой пример, однако на практике бывает необходимо передавать большое количество полей, для этих целей удобно использовать массивы.
$arIns = []; $arIns[] = 10; $arIns[] = "first_name"; $arIns[] = "John"; $wpdb->query( $wpdb->prepare( "INSERT INTO $wpdb->usermeta ( user_id, meta_key, meta_value ) VALUES ( %d, %s, %s )", $arIns ));
Для обращения к стандартным таблицам, в классе существуют специальные переменные, которые содержат их названия.
$wpdb->commentmeta $wpdb->comments $wpdb->links $wpdb->options $wpdb->postmeta $wpdb->posts $wpdb->terms $wpdb->term_relationships $wpdb->term_taxonomy $wpdb->usermeta $wpdb->users
Для примера, давайте удалим первую запись из таблицы wp_post используя такую переменную.
$wpdb->query("DELETE FROM $wpdb->posts WHERE id = '1'");
Префикс таблицы и её название подставляются из переменной, это конечно здорово, но бывает случаи, когда требуется обращаться к таблицам, которых нет по умолчанию в WordPress. Чтобы получить префикс таблицы из файла конфигурации, можно использовать значение переменной $wpdb->prefix. Таким образом, отдельно указывается префикс таблицы и её название.
$wpdb->query("DELETE FROM ".$wpdb->prefix."posts WHERE id='1'");
В примерах, наглядно было показано, как можно удалять записи в таблице. Не редко приходится делать выборку данных из таблиц, с использованием оператора SELECT. Для получения результата выполнения запроса существует метод get_result().
Параметры метода get_result()
$wpdb->get_results('query', $result_type);
Первый параметр – это сама строка запроса SELECT, второй параметр $result_type является не обязательным, определяет какой тип данных вернёт метод в качестве результата.
В качестве примера использования давайте выберем заголовки 10 последних опубликованных страниц из базы данных в порядке убывания по дате публикации.
$posts = $wpdb->get_results( "SELECT post_title FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'page' ORDER BY post_date DESC LIMIT 10"); if ($posts){ foreach ($posts as $page){ echo $page->post_title; } }
Как вы можете заметить второй параметр не был указан, а значит результат выборки будет возвращён в виде объекта. Не всегда приходится выбирать записи в виде списка. Использование данного метода в случае если нужно значение одного поля не всегда удобно. Для этих целей существует другой метод get_var().
Метод get_var() позволяет получить в качестве результата какое-то одно значение. Это может быть значение одного поля, либо значение суммы или количества записей.
Параметры метода get_var()
$wpdb->get_var('query',$col_offset ,$row_offset);
Теперь давайте рассмотрим несколько примеров. В качестве первого примера давайте получим дату регистрации пользователя с ID равным 10.
$date = $wpdb->get_var("SELECT user_registered FROM $wpdb->users WHERE ID=10"); echo $date;
Если пользователь с таким ID существует, то в качестве результата мы получим дату регистрации пользователя. Теперь давайте попробуем подсчитать количество активных страниц на сайте.
$page_count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'page';"); echo "Всего страниц на сайте {$page_count}.";
В результате, мы получим сообщение с количеством страниц, которые имеют статус «Опубликовано». В данном примере в качестве результата возвращается одно значение. Иногда нужно получить значения одной строки, которое соответствует условию выборки. Для этих целей хорошо подходит метод get_row().
Параметры метода get_row()
$wpdb->get_row('query', $output_type, $row_offset);
В качестве первого параметра, как и в предыдущих примерах передаётся строка запроса. Второй параметр — $output_type, тип вывода данных, может быть значения:
В качестве третьего параметра $row_offset передаётся порядковый номер нужного ряда, значение по умолчанию равно 0.
Для примера давайте получим заголовок самой последней публикации.
$post = $wpdb->get_row( "SELECT post_title, post_content FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY post_date DESC LIMIT 0,1" ); echo $post->title;
В результате выполнения данного запроса будет получена одна запись, в качестве поля сортировки будет использована дата публикации поста. Мы так же можем получить запись из одной колонки, с помощью метода get_col().
Параметры метода get_col()
$wpdb->get_col('query', $col_offset);
Аналогичным образом, в качестве первого параметра передаётся строка запроса. В качестве второго параметра $col_offset передаётся номер нужной колонки, по умолчанию равно 0. Давайте рассмотрим пример с этим методом.
Получим заголовок последнего поста, в качестве результата метод должен вернуть одномерный объект.
$posts = $wpdb->get_col( "SELECT post_title FROM $wpdb->posts WHERE post_status = 'publish' AND post_type='page' ORDER BY post_date DESC" ); echo $posts[0];
Выводим значение, обращаясь к ключу одномерного объекта.
Теперь стоит рассмотреть возможность добавление записи в базу данных, посредством метода insert().
Параметры метода insert()
$wpdb->insert($table, $data, $format);
В качестве первого параметра $table – передаётся имя таблицы, в которую будет выполняться запись. Второй параметр — $data, это ассоциативный массив, в виде ключ-значение, содержит данные для записи в таблицу. Третий параметр — $format, содержит форматы значений, которые передаются во втором параметре. Теперь для наглядности давайте рассмотрим пример добавления записи в таблицу.
$wpdb->insert( $wpdb->prefix.'usermeta', // название такблицы array( // 'ключ' => 'значение' 'user_id' => 1, 'meta_key' => 'first_name', 'meta_value' => 'John' ), array( '%d', // %d - числовое значение '%s', // %s - строковое значение '%s' ) );
Таким образом, в таблицу wp_usermeta будет добавлена запись с соответствующими значениями полей из массива.
В заключении давайте рассмотрим метод позволяющий обновлять значения в таблице. Называется метод update(), и на вход получает пять параметров.
Параметры метода update()
$wpdb->update($table, $data, $where, $format, $where_format);
В качестве первого параметра — $table передаётся имя таблицы. В качестве второго параметра передается массив с новыми значениями для полей, которые будут обновляться. Третий параметр ($where) – фильтр, согласно которому будут обновляться поля. Четвёртый параметр ($format) – формат данных полей, которые будут обновляться. Четвёртый параметр ($where_format) – формат полей для условия выборки. Описание параметров получилось немного запутанным, поэтому давайте рассмотрим пример обновления записи в базе.
$wpdb->update( $wpdb->prefix . 'usermeta', // имя таблицы array('meta_value' => 'Smith'), // меняем значение array( // согласно фильтру 'user_id' => 1, 'meta_key' => 'first_name' ), array( '%s' ), // формат обновляемого поля array( // формат полей фильтра '%d', '%s' ) );
В результате работы метода, будет обновлено значение поля meta_value в таблице wp_usermeta, у записи соответствующие параметрам полей в фильтре. На этом, пожалуй, всё. Мы рассмотрели все основные методы, которых бывает достаточно в большинстве случаев для работы с базой данных.