Взаимодействие с базой данных в WordPress. Класс $wpdb.

Помню, когда я только начинал использовать 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'
	) 
);
вставка строки в MySql таблицу INSERT

UPDATE

Предположим в прошлом примере мы всё-таки создали строку и сейчас хотим её обновить:

$wpdb->update( 
	$wpdb->prefix . 'usermeta', // указываем таблицу
	array('meta_value' => 'Миша'), // поменяем имя 
	array( // где 
		'user_id' => 1,
		'meta_key' => 'first_name'
	), 
	array( '%s' ),
	array( // формат для &laquo;где&raquo;
		'%d',
		'%s'
	)
);
UPDADE - обновление строки в таблице MySql
Миша Рудрастых Разработчик WordPress WooCommerce

Миша Рудрастых

Впервые познакомился с WordPress в 2009 году, и после двух лет мучений с Joomla и самописными движками это был просто бальзам на душу. С 2014 года меня можно встретить на WordCamp — официальной конфе по WP в Москве, иногда там выступаю. Также в настоящее время веду курсы по WordPress в Epic Skills в Питере.

Смотрите также