Cover Image for База данных WordPress: ключевые таблицы, API и безопасная работа с данными

База данных WordPress: ключевые таблицы, API и безопасная работа с данными

29 декабря 2025

База данных — фундамент WordPress. В ней хранится всё: записи и страницы, пользователи и комментарии, рубрики и метки, настройки сайта и данные плагинов. Чтобы надёжно расширять сайт, разработчику важно понимать схему таблиц, пользоваться высокоуровневыми API и знать, когда уместны собственные таблицы.

TL;DR

  • WordPress работает на MySQL (совместим с MariaDB); по умолчанию создаётся 12 таблиц с префиксом wp_ (может быть изменён).
  • Контент и пользователи хранятся в шести ключевых таблицах: wp_posts, wp_postmeta, wp_comments, wp_commentmeta, wp_users, wp_usermeta.
  • Для взаимодействия используйте Database API и профильные API (Posts, Metadata, Options, Taxonomy), а для особых случаев — $wpdb c prepare().
  • Настройки хранятся в wp_options; избегайте перегруза автозагружаемых опций, применяйте Transients и объектный кеш.
  • Собственные таблицы создавайте через dbDelta() и версионирование схемы; продумывайте индексы и миграции.

Что такое база данных WordPress

WordPress использует реляционную СУБД MySQL (часто это MariaDB на стороне хостинга). Схема состоит из набора таблиц с общим префиксом (по умолчанию wp_, задаётся в wp-config.php). Все данные сайта — от записей до настроек — живут в этих таблицах, а WordPress предоставляет функции и классы, которые скрывают сырой SQL и упрощают безопасное взаимодействие.

Ключевые таблицы: что где хранится

Контент

  • wp_posts — единая таблица для записей, страниц и любых кастомных типов (каждая строка — сущность поста).
  • wp_postmeta — метаполевая модель для постов (кастомные поля). Хранит пары «ключ—значение», расширяя структуру wp_posts.

Комментарии

  • wp_comments — данные комментариев.
  • wp_commentmeta — дополнительные атрибуты комментариев.

Пользователи

  • wp_users — базовые данные пользователя (логин, хэш пароля, email и т. д.).
  • wp_usermeta — роли, возможности и иные свойства пользователя.

Таксономии

  • wp_terms — термины (категории, метки и любые термины кастомных таксономий).
  • wp_term_taxonomy — определяет таксономию термина (категория, метка, произвольная).
  • wp_term_relationships — связи терминов с объектами (записи, страницы и т. п.).
  • wp_termmeta — метаданные терминов.

Настройки и совместимость

  • wp_options — опции сайта (ключ—значение), в том числе активная тема, активные плагины, базовые настройки. Поддерживает сериализованные данные; большие опции следует хранить с autoload=no, чтобы не перегружать автозагрузку.
  • wp_links — устаревшая таблица для «Блогролла», сохранена ради обратной совместимости.

Как правильно взаимодействовать с данными

Высокоуровневые API: сначала они

Большинство задач решается без SQL благодаря функциям WordPress. Для постов есть wp_insert_post(), wp_update_post(), wp_delete_post() и выборки get_posts()/get_post(). Для комментариев, пользователей и терминов существуют аналогичные CRUD-функции. Метаданные управляются через add_post_meta(), update_post_meta(), delete_post_meta() и их аналоги для пользователей, комментариев и терминов. Настройки — через Options API: add_option(), update_option(), delete_option(), а также get_option().

Для сложных выборок контента используйте WP_Query или get_posts() с аргументами фильтрации, пагинацией и сортировкой. Это даёт кэширование, безопасность и совместимость с экосистемой.

Низкоуровневый доступ: $wpdb

Класс $wpdb — это тонкая абстракция поверх MySQL, позволяющая выполнять подготовленные запросы и получать результаты в разных форматах. Используйте его, когда готовых API недостаточно (например, отчёты или объединения).

global $wpdb;
$post_id = 123;
$sql = $wpdb->prepare(
    "SELECT meta_value FROM {$wpdb->postmeta} WHERE post_id = %d AND meta_key = %s",
    $post_id,
    'rating'
);
$rating = $wpdb->get_var($sql);

Ключевое правило безопасности — всегда применять $wpdb->prepare() для подстановки параметров. Не конкатенируйте пользовательский ввод в SQL. При необходимости возможны транзакции (START TRANSACTION/COMMIT/ROLLBACK) при поддержке движка InnoDB.

Инструменты для доступа

  • phpMyAdmin — наиболее распространённый веб‑инструмент работы с БД.
  • Adminer — компактная альтернатива в виде одного PHP‑файла.

Производительность и надёжность

  • Кэширование: применяйте Transients API для временных вычислений и объектный кеш для снижения нагрузки на БД. В продакшене уместны Redis/Memcached через drop‑in.
  • Опции: контролируйте autoload в wp_options. Крупные или редко используемые массивы держите с autoload=no, используйте транзиенты для дорогих выборок.
  • Индексы: при добавлении собственных таблиц проектируйте первичные ключи и вторичные индексы по полям фильтрации. Это критично для масштабируемости.
  • Безопасность: валидация и санитизация ввода, проверки прав через current_user_can(), nonce‑поля в формах, подготовленные выражения в SQL.

Собственные таблицы: когда и как

Постмета удобна, но при большом объёме данных и сложной аналитике превращается в узкое место. В таких случаях проектируйте собственные таблицы под конкретную модель данных. Это путь, которым идут крупные плагины электронной коммерции (заказы и связанные сущности вынесены в специализированные таблицы для ускорения отчётов и массовых операций).

Создание и миграции

Создавайте схемы через dbDelta() в активации плагина и храните версию схемы в опции. Так вы сможете безопасно эволюционировать структуру при обновлениях.

function my_plugin_activate() {
    global $wpdb;
    $table = $wpdb->prefix . 'events';
    $charset = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $table (
        id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
        post_id BIGINT UNSIGNED NOT NULL,
        starts_at DATETIME NOT NULL,
        ends_at DATETIME NULL,
        status VARCHAR(20) NOT NULL,
        PRIMARY KEY  (id),
        KEY post_id (post_id),
        KEY starts_at (starts_at)
    ) $charset;";

    require_once ABSPATH . 'wp-admin/includes/upgrade.php';
    dbDelta($sql);
    add_option('my_plugin_db_version', '1.0.0');
}

После создания зарегистрируйте таблицу в $wpdb (свойства с именами таблиц) и используйте подготовленные запросы. Продумайте внешние ключи (если уместно) и стратегию миграций.

Итоги

Понимание структуры базы и использование высокоуровневых API — залог безопасного и производительного кода на WordPress. Начинайте с готовых функций, переходите к $wpdb для точечных задач, а собственные таблицы применяйте там, где мета‑модель уже не справляется. Так проект будет масштабируемым, предсказуемым и дружелюбным к обновлениям.