Как создать собственную таблицу в WordPress и работать с ней через плагин

В стандартном функционале 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.

Как создать свой шорткод в WordPress: подробное руководство с примерами
31.10.2025
Как изменить автозагрузку картинок (lazy load) в WordPress
13.12.2025
Как удалить редирект в WordPress: практические методы и примеры кода
18.11.2025
Как использовать хук pre_get_posts для фильтрации постов в WordPress
29.12.2025
Как создать собственную таблицу в WordPress и работать с ней через плагин
30.11.2025