Примеры работы с базой данных
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
.