О web-разработке
и даже немного больше...

Работа с базой данных в WordPress

Взаимодействие с базой данных является одним из ключевых моментов работы практически любого современного сайта. Популярные движки в ряде случаев имеют встроенные 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'");

Выборка данных из таблиц в WordPress

В примерах, наглядно было показано, как можно удалять записи в таблице. Не редко приходится делать выборку данных из таблиц, с использованием оператора SELECT. Для получения результата выполнения запроса существует метод get_result().

Параметры метода get_result()

$wpdb->get_results('query', $result_type);

Первый параметр – это сама строка запроса SELECT, второй параметр $result_type является не обязательным, определяет какой тип данных вернёт метод в качестве результата.

  • OBJECT — В виде объекта (зн. по умолчанию);
  • OBJECT_K — Ассоциативный массив, в качестве ключей будут использованы значения из первой колонки, дубликаты будут проигнорированы;
  • ARRAY_A — Массив с числовым индексом, состоящий из ассоциативных массивов, у тех в свою очередь будут использоваться названия колонок в качестве индексов;
  • ARRAY_N — Массив с числовым индексом.

В качестве примера использования давайте выберем заголовки 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);
  • $col_offset — номер колонки (по умолчанию 0);
  • $row_offset — номер строки (по умолчанию 0).

Теперь давайте рассмотрим несколько примеров. В качестве первого примера давайте получим дату регистрации пользователя с 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, тип вывода данных, может быть значения:

  • OBJECT — В виде объекта (по умолчанию);
  • ARRAY_A — В виде ассоциативного массива;
  • ARRAY_N — Массив с числовым индексом.

В качестве третьего параметра $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) в таблицы WordPress

Теперь стоит рассмотреть возможность добавление записи в базу данных, посредством метода 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) записей в таблицах WordPress

В заключении давайте рассмотрим метод позволяющий обновлять значения в таблице. Называется метод 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, у записи соответствующие параметрам полей в фильтре. На этом, пожалуй, всё. Мы рассмотрели все основные методы, которых бывает достаточно в большинстве случаев для работы с базой данных.

Опубликован: 02.03.2021 г.

См. также:

SQL-запросы для смены домена в WordPress
Как изменить тип таблиц в MySQL?
Изменение кодировки таблиц в базе MySQL
Фильтрация по полю DateTime в MySQL
Меняем пароль root в MySQL 5.7
Исправление ошибок в базе MySQL
Восстановление пароля root в MySQL
Утилита Mytop для MySQL

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Комментарии
  • Загрузка...
Друзья сайта