В стандартном функционале WordPress все данные хранятся в предопределённых таблицах базы данных. Иногда возникает задача создать собственную таблицу для хранения специфичных данных, которые не удобно помещать в стандартные типы записей или метаданные. В этой статье мы подробно разберём, как правильно создавать собственную таблицу в WordPress, как интегрировать её с вашим плагином и как работать с ней через API WordPress.
Зачем нужна собственная таблица в WordPress
Часто разработчики пытаются хранить все данные через стандартные механизмы WordPress: посты, метаполя, кастомные типы записей. Но для сложных структур данных или крупных объёмов это не всегда удобно и эффективно. Например, если нужно хранить логи, статистику, большое количество записей с уникальной структурой, то собственная таблица будет оптимальным решением.
Создание собственной таблицы даёт вам полный контроль над структурой, индексами и скоростью запросов. Это особенно важно для проектов с высокими требованиями к производительности.
Важно правильно интегрировать такую таблицу с WordPress, чтобы не нарушать обновления и стандарты платформы.
Создание таблицы при активации плагина
Функция создания таблицы с использованием dbDelta
WordPress предоставляет функцию dbDelta, которая позволяет создавать и обновлять таблицы в базе данных, сравнивая текущую схему с требуемой. Это лучшее решение для создания таблиц в плагинах.
Рассмотрим пример создания таблицы с названием wp_wptemy_custom_data для хранения пользовательских записей с полями ID, user_id, data и created_at.
function wptemy_create_custom_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'wptemy_custom_data';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
user_id bigint(20) NOT NULL,
data text NOT NULL,
created_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
PRIMARY KEY (id),
KEY user_id (user_id)
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
}
register_activation_hook( __FILE__, 'wptemy_create_custom_table' );
Обратите внимание, что префикс таблицы берётся из $wpdb->prefix, чтобы соблюсти настройки базы данных.
Функция dbDelta грамотно создаст таблицу, а при повторном запуске обновит структуру, если вы внесёте изменения.
Работа с таблицей через $wpdb: базовые операции
После создания таблицы нужно уметь с ней работать — добавлять, получать, обновлять и удалять записи. Для этого используется объект $wpdb, который предоставляет удобный интерфейс для запросов.
Добавление записи
Для вставки данных в таблицу используйте метод $wpdb->insert():
function wptemy_insert_custom_data( $user_id, $data ) {
global $wpdb;
$table_name = $wpdb->prefix . 'wptemy_custom_data';
$result = $wpdb->insert(
$table_name,
[
'user_id' => $user_id,
'data' => $data,
'created_at' => current_time( 'mysql' )
],
[
'%d',
'%s',
'%s'
]
);
return $result !== false;
}
Метод принимает имя таблицы, массив данных и массив форматов для защиты от SQL-инъекций.
Получение записей
Для выборки данных используйте $wpdb->get_results():
function wptemy_get_custom_data_by_user( $user_id ) {
global $wpdb;
$table_name = $wpdb->prefix . 'wptemy_custom_data';
$query = $wpdb->prepare( "SELECT * FROM $table_name WHERE user_id = %d ORDER BY created_at DESC", $user_id );
return $wpdb->get_results( $query );
}
Метод prepare помогает безопасно подставить параметры в запрос.
Обновление записи
Для изменения данных используется $wpdb->update():
function wptemy_update_custom_data( $id, $data ) {
global $wpdb;
$table_name = $wpdb->prefix . 'wptemy_custom_data';
$result = $wpdb->update(
$table_name,
[ 'data' => $data ],
[ 'id' => $id ],
[ '%s' ],
[ '%d' ]
);
return $result !== false;
}
Удаление записи
Удаление реализуется через $wpdb->delete():
function wptemy_delete_custom_data( $id ) {
global $wpdb;
$table_name = $wpdb->prefix . 'wptemy_custom_data';
$result = $wpdb->delete( $table_name, [ 'id' => $id ], [ '%d' ] );
return $result !== false;
}
Интеграция собственной таблицы с интерфейсом WordPress
Чтобы сделать данные из собственной таблицы доступными в админке, можно добавить собственное меню и страницы с таблицами и формами.
Добавление меню и страницы в админке
Пример создания меню:
function wptemy_admin_menu() {
add_menu_page(
'Custom Data',
'Custom Data',
'manage_options',
'wptemy_custom_data',
'wptemy_render_custom_data_page',
'dashicons-database',
20
);
}
add_action( 'admin_menu', 'wptemy_admin_menu' );
Вывод данных на странице
Простейший вывод данных из таблицы:
function wptemy_render_custom_data_page() {
$data = wptemy_get_custom_data_by_user( get_current_user_id() );
echo '<h1>Мои данные</h1>';
echo '<table class="wp-list-table widefat fixed">';
echo '<thead><tr><th>ID</th><th>Данные</th><th>Дата</th></tr></thead>';
echo '<tbody>';
foreach ( $data as $row ) {
echo '<tr>';
echo '<td>' . esc_html( $row->id ) . '</td>';
echo '<td>' . esc_html( $row->data ) . '</td>';
echo '<td>' . esc_html( $row->created_at ) . '</td>';
echo '</tr>';
}
echo '</tbody></table>';
}
Резюме и лучшие практики при работе с собственными таблицами
Создание собственной таблицы — мощный инструмент, но требует аккуратности. Вот основные рекомендации:
- Используйте префикс
$wpdb->prefixдля имен таблиц, чтобы избежать конфликтов. - Создавайте таблицы через
dbDeltaпри активации плагина. - Обязательно используйте подготовленные запросы
$wpdb->prepareдля безопасности. - Храните только те данные, которые нельзя эффективно поместить в стандартные таблицы WordPress.
- Добавляйте админские страницы для управления данными и удобства пользователей.
- Проверяйте права доступа при работе с данными в админке.
Следуя этим советам, вы создадите стабильное и удобное решение для хранения специфичных данных в WordPress.