Примеры работы с базой данных

WordPress предоставляет возможность удобно работать с базой данных за счет класса $wpdb. При этом можно управлять произвольными таблицами в базе данных, не обязательно только теми, которые были созданы WordPress.

Проверить существование таблицы

Скопировано
global $wpdb;
$table_name = $wpdb->prefix . 'posts';
if( $wpdb->get_var( "SHOW TABLES LIKE '$table_name'" ) != $table_name ) {
// таблица не существует
}
Показать код

В этом примере мы проверяем существование таблицы wp_posts (строка 2), при условии, что для имен таблиц в WordPress используется стандартный префикс wp_.

Получить список всех таблиц

Скопировано
global $wpdb;
$tables = $wpdb->get_results( 'SHOW TABLES' );
foreach( $tables as $table ) {
foreach( $table as $t ) {
echo $t . '<br>';
}
}
Показать код

Создать таблицу

Скопировано
global $wpdb;
$table_name = 'TEST_TABLE';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
	id mediumint(9) NOT NULL AUTO_INCREMENT,
	field_x text NOT NULL,
	field_y text NOT NULL,
	UNIQUE KEY id (id)
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
Показать код

В результате будет создана таблица с названием TEST_TABLE и тремя столбцами: id, field_x и field_y. Так же поле id будет назначено уникальным ключом.

Добавить строку в таблицу

Скопировано
global $wpdb;
$res = $wpdb->insert( 'tbl_name', [ 'field_name' => 'field_val' ] );
if( ! $res ) echo "ошибка при добавлении строки";
Показать код

Добавить строку в таблицу, если строка не существует

Иногда нужно вставить в таблицу новую строку только, если уже нет строки с заданным значением поля. Это можно сделать, например, так:

Скопировано
global $wpdb;
$wpdb->replace( 
	'tbl_name', 
	[
		'session_id' => session_id(),
		'order_id' => 'текст 2'
	]
);
Показать код

В данном примере, если ID сессии пользователя уже есть в таблице, то новая строка не добавляется, а просто перезаписывается значение столбца order_id.

Чтобы код работал нужно чтобы какое-то из полей таблицы было уникальным. И тогда именно по нему будет производиться сравнение.

Обновить значения столбцов в строке таблицы

Пример 1

Скопировано
global $wpdb;
$wpdb->query( "UPDATE tbl_name SET col1 = %s, col2 = %s WHERE id = %d", [ 'текст 1', 'текст 2', 555 ] );
Показать код

Пример 2

Скопировано
global $wpdb;
$wpdb->update( 'tbl_name',
[ 'col1' => 'текст 1', 'col2' => 'текст 2' ],
[ 'id' => 555 ]
);
Показать код

Здесь в первом массиве задаем соответствия названий столбцов и новых значений. А во втором, как будет определяться строка для обновления. В данном примере та, у которой значения столбца id = 555.

Удалить строки в таблице

Одну строку

Скопировано
$wpdb->delete( 'tbl_name', [ 'id' => 555 ] );
Показать код

Здесь мы удаляем из таблицы tbl_name строку в которой столбец id = 555.

Несколько строк

Скопировано
global $wpdb;
$ids = [5, 7];
$ids = implode( ',', $ids );
$wpdb->query( "DELETE FROM tbl_name WHERE id IN ($ids)" );
Показать код

В этом примере мы удаляем из таблицы tbl_name строки со значениями 5 и 7 в столбце id.

Найти строку с заданным значением столбца

Скопировано
global $wpdb;
$res = $wpdb->get_row( "SELECT * FROM tbl_name WHERE ID = 1 LIMIT 1" );
Показать код

Вернет все значения полей строки, у которой значение столбца ID = 1.

Получить все строки из таблицы

Скопировано
global $wpdb;
$rows = $wpdb->get_results( "SELECT * FROM tbl_name" );
Показать код

Удалить все записи произвольного типа записей

Скопировано
global $wpdb;
$wpdb->query( $wpdb->prepare( "
	DELETE a,b,c
		FROM wp_posts a
		LEFT JOIN wp_term_relationships b
			ON (a.ID = b.object_id)
		LEFT JOIN wp_postmeta c
			ON (a.ID = c.post_id)
		WHERE a.post_type = %s
	", [ 'my_post_type' ]
));
Показать код

Здесь мы удаляем с сайта все пользовательские записи типа my_post_type.