Все сведения о настройках внешнего вида и содержании сайта WordPress хранит в реляционной базе данных. Поддерживается только MySQL версии 5.0.15 или выше, или любая версия MariaDB. Обычно WordPress и плагины взаимодействует с этой базой данных самостоятельно, и конечному пользователю не нужно сильно беспокоиться о ее структуре. Однако, для разработки собственного плагина или иного взаимодействия с содержимым сайта важно точно знать, как WordPress хранит свои данные. Зная структуру данных и обладая доступом к DB можно получить и/или изменить любые сведения, содержания, структуры и представления непосредственно в таблицах, не используя консоль WordPress и даже без авторизации на самом сайте.
Официально Описание Структуры Базы Данных предыдущей версии WordPress 4.4 доступно на //codex.wordpress.org, где также есть ссылка на описание еще более ранних версий WordPress 1.5, 2.0, 2.2, 2.3, 2.5, 2.7, 2.8, 2.9 и 3.3.
Ниже в публикации описана структура данных WordPress 5.2.4 актуальная на 10 октября 2019 года.
Таблицы

Базовый набор WordPress включает 12 таблиц в довольно простой схеме (для которой, к тому же, фактически не обеспечивается целостность данных):
- wp_options: простая и самостоятельная, в текстовых option_value в свободной форме хранятся настройки WordPress, параметры консоли, плагинов.
- wp_users: зарегистрированные пользователи, логины, хэш паролей и прочее, связана по user_id с другими таблицами;
- wp_usermeta: простая, подчинена wp_users, хранит в текстовых meta_value в свободной форме хранятся метаданные зарегистрированных пользователей, персональные настройки, данные профиля, цветовая схема, контактные данные, биография, никнейм и другие.
- wp_posts: хранит весь содержательный контент в текстовом post_content и его главные атрибуты (автора, тип, статус, mime и прочее), связана по post_id с другими таблицами.
- wp_postmeta: хранит разные метаданные о контенте по произвольным текстовым ключам meta_key в текстовом meta_value в свободной форме, информацию о прикреплённых файлах (изображения, документы, видео), данные заполняемых полей при создании или редактировании записей, используется плагинами.
- wp_terms: хранит термины и их UTF-8 представления, которые служат категориями, метками и другими терминами пользовательских таксономий.
- wp_termmeta: метаданные терминов, которые используются только плагинами.
- wp_term_relationships: хранит связи категорий и меток таблицы wp_terms и эта связь здесь поддерживается.
- wp_term_taxonomy: хранит таксономии (категории, теги) для записей в таблице wp_terms и устанавливается очередность и вложенность категорий.
- wp_comments: комментарии и основные данные (имя автора, еМейл, IP, браузер).
- wp_commentmeta: метаданные комментариев, используется плагинами.
- wp_links: устарела и используется редкими плагинами для внутреннего менеджмента ссылок.
wp_posts
Несмотря на то, что в названии стоит “пост”, эта таблица содержит все виды постов, или же все виды контента. Эта таблица содержит все посты, страницы, корректировки и кастомные типы постов.
Field | Type | Length | Not NULL | Comment |
---|---|---|---|---|
ID | bigint | 20 | + | Уникальный идентификатор поста |
post_author | bigint | 20 | + | Идентификатор автора связывает с таблицей wp_users, 0 означает отсутствие автора |
post_date | datetime | 0 | + | Дата и время создания поста |
post_date_gmt | datetime | 0 | + | Дата и время создания поста по Гринвичу (GMT) (YYYY-MM-DD HH:MM:SS) |
post_content | longtext | 0 | + | Текст содержания поста |
post_title | text | 0 | + | Заголовок |
post_excerpt | text | 0 | + | Выдержка из записи (отрывок текста) User-defined post excerpt // Для ваших цитат из поста. |
post_status | varchar | 20 | + | Статус поста
|
comment_status | varchar | 20 | + | Статус комментирования
|
ping_status | varchar | 20 | + | Статус пингов и трекбеков
|
post_password | varchar | 255 | + | Пароль защиты поста, в качестве которого может служить любая строка (без какого-либо шифрования). Пароль будет запрашиваться перед отображением страницы. Пустой пароль означает отсутствие защиты. |
post_name | varchar | 200 | + | уникальный строчный идентификатор (slug, ЧПУ) в кодировке UTF-8, который используется в URL, если в настройках постоянных ссылок включена опция ЧПУ, post_name образуется из значения post_title удалением всех знаков и заменой пробелов заменяют минусом |
to_ping | text | 0 | + | URL'ы для пингов |
pinged | text | 0 | + | URL'ы, которые уже были «пропингованы» !!! несколько УРЛей и половина на себя: http://mir-anti-vir.org/kljuchi-dlja-antivirusov/kody-aktivacii-dlya-eset-smart-security-9-ess-9/ http://mir-anti-vir.org/kljuchi-dlja-antivirusov/klyuchi-dlya-antivirusov-kaspersky/
|
post_modified | datetime | 0 | + | Дата и время изменения по местному времени |
post_modified_gmt | datetime | 0 | + | Дата и время по Гринвичу (GMT) (YYYY-MM-DD HH:MM:SS) |
post_content_filtered | longtext | 0 | + | пустой |
post_parent | bigint | 20 | + | ID родительской записи (для страниц, вложений и т.п.) 0 (x174) 192 (x120) 127 (x90) … |
guid | varchar | 255 | + | Cсылка на запись. Примечание: не всегда GUID это постоянная (неизменяемая) ссылка на запись (как это было до версии 2.5). Можно сказать, что это текущая ссылка на конкретную запись. !!! локальные URL, многие не работают |
menu_order | int | 11 | + | Число определяющее «рейтинг» записи (влияет на порядок вывода страниц в списке) |
post_type | varchar | 20 | + | Тип поста. Существует 5 предустановленных типа:
Зарезервированные типы:
Источник: а //sheensay.ru Пользовательские Произвольные типы:
|
post_mime_type | varchar | 100 | + | Mimе-тип (для вложений, проч.)
|
comment_count | bigint | 20 | + | счетчик числа комментариев |
wp_postmeta
Эта таблица содержит метаинформацию о ваших постах, страницах и кастомных типах постов. Пример метаинформации о посте – шаблон, который используется для отображения страницы, кастомные поля и т.д. Некоторые плагины также используют эту таблицу для хранения данных плагина, таких как информация о SEO WordPress.
Field | Type | Length | Not NULL | Comment |
---|---|---|---|---|
meta_id | bigint | 20 | + | |
post_id | bigint | 20 | + | |
meta_key | varchar | 255 |
метаданные элементов меню:
неисследованные метаданные: popup_settings 8727 |
|
meta_value | longtext | 0 | значение метаданных интерпретируются в зависимости от значения в поле meta_key
a:31:{s:17:""disable_on_mobile"";...;} 8725 |
wp_comments
//Как можно догадаться по названию, эта таблица содержит комментарии на вашем WordPress. Она содержит имя автора комментария, его url, имейл, сам комментарий и т.д.
Field | Type | Length | Not NULL | Comment |
---|---|---|---|---|
comment_ID | bigint | 20 | + | Идентификатор комментария |
comment_post_ID | bigint | 20 | + | Идентификатор поста wp_posts.post_id |
comment_author | tinytext | 0 | + | Произвольное имя автора |
comment_author_email | varchar | 100 | + | |
comment_author_url | varchar | 200 | + | |
comment_author_IP | varchar | 100 | + | |
comment_date | datetime | 0 | + | |
comment_date_gmt | datetime | 0 | + | |
comment_content | text | 0 | + | Содержание комментария |
comment_karma | int | 11 | + | |
comment_approved | varchar | 20 | + | spam 144 trash 119 1 9 |
comment_agent | varchar | 255 | + | "Браузер" которым комментарий был оставлен |
comment_type | varchar | 20 | + | //название типа комментария. Названия можно указывать произвольные.Комментарии в WordPress делятся на типы: обычный комментарий, Trackback или Pingback. trackback 263 <>7 pingback 2 |
comment_parent | bigint | 20 | + | Идентификатор родительского комментария в иерархии |
user_id | bigint | 20 | + | Идентификатор авторизованного автора комментария (wp_users.user_id) |
wp_commentmeta
Эта таблица содержит информацию о комментариях, опубликованных на сайте WordPress. В этой таблице есть четыре разных поля – meta_id, comment_id, meta_key и meta_value. Каждый meta_id связан с comment_id. Пример метаинформации комментария – его статус (одобрен, рассматривается, удален и т.д.).
Field | Type | Length | Not NULL | Comment |
---|---|---|---|---|
meta_id | bigint | 20 | + | идентификатор . |
comment_id | bigint | 20 | + | |
meta_key | varchar | 255 | ||
meta_value | longtext | 0 |
wp_terms
В WordPress существует мощная система таксономий, которая позволяет организовывать ваш контент. Индивидуальные составляющие таксономии называются terms и хранятся в этой таблице. К примеру, ваши категории и тэги на WordPress – это таксономии, и каждая отдельная категория и тэг – это term.
Field | Type | Length | Not NULL | Comment |
---|---|---|---|---|
term_id | bigint | 20 | + | идентификатор термина |
name | varchar | 200 | + | термин |
slug | varchar | 200 | + | термин в кодировке UTF-8 |
term_group | bigint | 10 | + | Устаревшее поле, больше не используется |
В частности wp_terms содержит:
- рубрики (name - название рубрики, slug - ярлык рубрики в UTF-8)
- меню (name - название меню, slug - название меню в нижнем регистре в кодировке UTF-8)
Вид (назначение) каждой записи определено в таблице wp_term_taxonomy
wp_termmeta
//Содержит метаданные терминов. Эта таблица дополняет таблицу wp_terms.
В wp_termmeta принято сохранять любые дополнительные данные термина, например это могут быть СЕО поля: заголовок, описание и что угодно еще.
Структуру таблица имеет такую же, как и другие таблицы метаданных: wp_postmeta, wp_commentmeta, wp_usermeta. Логика хранения, кэширования и получения метаданных WP едина для всех типов метаданных: посты, таксы, комменты, юзеры (об этом написал отдельную статью).
По умолчанию, эта таблицы не задействована и всегда пуста. Она используется при расширении базовых возможностей WP, как правило плагинами.
wp_term_taxonomy
Эта таблица определяет таксономии для terms в таблице wp_terms. Например, если у вас есть term “Туториалы WordPress”, то в этой таблице будут содержаться данные, в которых будет указано, что он относится к таксономии “категории”. Другими словами, в этой таблице находятся данные, помогающие WordPress различать между terms и определять, какой из них является категорией, тэгом и т.д.
Field | Type | Length | Not NULL | Comment |
---|---|---|---|---|
term_taxonomy_id | bigint | 20 | + | Идентификатор таксономии |
term_id | bigint | 20 | + | Идентификатор термина |
taxonomy | varchar | 32 | + | Вид таксономии термина
|
description | longtext | 0 | + | Описание таксономии |
parent | bigint | 20 | + | Идентификатор родительского термина для древовидных таксономий |
count | bigint | 20 | + | Счетчик количества записей в термине |
wp_term_relationship
Эта таблица отвечает за соотношение между типами постов WordPress и terms в таблице wp_terms. Эта таблица помогает WordPress определить пост X в категорию Y.
Field | Type | Length | Not NULL | Comment |
---|---|---|---|---|
object_id | bigint | 20 | + | //Содержит ID записи (значение поля ID из таблицы wp_posts). Если включена поддержка ссылок, то также будет содержать ID ссылки из таблицы wp_links. |
term_taxonomy_id | bigint | 20 | + | //Содержит значение такого же поля из таблицы wp_term_taxonomy. |
term_order | int | 11 | + | //Содержит порядок в котором были указаны термины, при прикреплении их к записи. Например, при редактировании записи мы указали ей 2 рубрики и 3 метки, вот в каком порядке мы их видим (они передались в POST запросе), такие значения сюда будут записаны: 1, 2 для рубрик, и 1, 2, 3 для меток.По умолчанию эта функция отключена для всех встроенных таксономий (поле содержит 0). Чтобы её включить, нужно указать параметр sort при регистрации таксономии, см. register_taxonomy(). |
wp_options
Эта таблица содержит большую часть настроек вашего сайта WordPress, таких как: url сайта, имейл админа, дефолтная категория, количество постов на странице, формат времени и многое другое. Таблица опций также используется множеством плагинов WordPress для хранения настроек плагинов.
Field | Type | Length | Not NULL | Comment |
---|---|---|---|---|
option_id | bigint | 20 | + | |
option_name | varchar | 191 | имя параметра
|
|
option_value | longtext | 0 | + | //Каждая запись в поле option_name будет представлять собой уникальное значение: если вы добавите более одного значения к опции, WordPress сохранит их в виде массива в поле option_value. Прекрасный пример этого: опция active_plugins, которая хранит массив плагинов, активированных на сайте. |
autoload | varchar | 20 | + | //определяет, будет или нет та или иная опция загружаться в функцию wp_load_alloptions(). Автозагружаемые данные – это данные, которые загружаются на каждой странице вашего WordPress-сайта. Ситуация здесь такая же, как и со скриптами – далеко не всегда они должны загружаться на всех страницах сайта. Атрибут autoload по умолчанию ставится в «yes», однако теоретически далеко не каждому плагину требуется загружать свои данные на каждой странице. |
wp_users
Содержит информацию о пользователях, такую как имя пользователя, пароль, имэйл и т.д.
Field | Type | Length | Not NULL | Comment |
---|---|---|---|---|
ID | bigint | 20 | + | Идентификатор |
user_login | varchar | 60 | + | Логин |
user_pass | varchar | 255 | + | Хэш пароля (по умолчанию 128-битный MD5) |
user_nicename | varchar | 50 | + | Имя пользователя /Если не указать, будет как логин. |
user_email | varchar | 100 | + | eMail адрес пользователя |
user_url | varchar | 100 | + | Ссылка на сайт пользователя |
user_registered | datetime | 0 | + | Дата и время регистрации |
user_activation_key | varchar | 255 | + | Ключ активации пользователя |
user_status | int | 11 | + | Статус, хранящийся в виде числа – с его помощью можно определить, подтвердил ли пользователь регистрацию по почте, к примеру. Он не сохраняет пользовательские роли. |
display_name | varchar | 250 | + | Отображаемое имя пользователя |
wp_usermeta
Содержит метаинформацию о пользователях вашего сайта.
Field | Type | Length | Not NULL | Comment |
---|---|---|---|---|
umeta_id | bigint | 20 | + | |
user_id | bigint | 20 | + | |
meta_key | varchar | 255 |
|
|
meta_value | longtext | 0 |
wp_links
//Ранее, до версии WP 3.5, а консоли WordPress было отдельное меню «Сссылки/Links». Можно было добавлять и группировать сторонние ссылки. Отвечал за управление ссылками устаревший плагин «Link Manager». Таблица wp_links собирала все данные по этим ссылкам. Сейчас используется некоторыми плагинами.
//Используется, чтобы управлять блогроллами в более ранних версиях WordPress или через плагин Link Manager.
- link_id
- link_url
- link_name
- link_image
- link_target
- link_description
- link_visible
- link_owner
- link_rating
- link_updated
- link_rel
- link_notes
- link_rss
Медиафайлы (Media)
К медиафайлам относятся изображения и видео определенных типов. Медиафайл может быть использован в публикациях через свой полный URL, который указывает на его физическое размещение в папке сайта .../wp-content/uploads/.... Помещение файла в эту папку и дальнейшее использование осуществляется через Библиотеку, которая регистрирует все медиафайлы. Медиафайлы, помещенные в папку медиафайлов в обход инструментов Библиотеки не отображаются в ней.
Библиотека (Library)
Раздел консоли Медиа содержит инструмент Библиотека (Library), который позволяет загружать, редактировать и удалять медиафайлы, при этом в DB внося соответствующие изменения. Каждый медиафайл загруженный через интерфейс библиотеки отражается соответствующими записями в таблицах wp_posts и wp_postmeta.
wp_posts
В таблице wp_posts медиафайлу соответствует единственная запись, в которой используется следующее назначение полей:
Field | Comment |
---|---|
ID | идентификатор медиафайла |
post_author | идентификатор user_id пользователя |
post_date | дата и время создания поста |
post_date_gmt | дата и время создания поста по Гринвичу (GMT) (YYYY-MM-DD HH:MM:SS) |
post_content | описание (Description) |
post_title | имя файла отображаемое в библиотеке, например 'demo' |
post_excerpt | подпись (Caption) может размещаться в публикации под медиафайлом |
post_status | всегда 'inherit' |
comment_status | всегда 'closed' |
ping_status | всегда 'closed' |
post_name | уникальный строчный идентификатор (slug, ЧПУ) в кодировке UTF-8 |
post_modified | дата и время изменения по местному времени |
post_modified_gmt | дата и время по Гринвичу (GMT) (YYYY-MM-DD HH:MM:SS) |
guid | полный URL, например 'https://.../wp-content/uploads/demo.svg' |
post_type | всегда 'attachment' |
post_mime_type | Значение соответствует типу медиафайла
|
wp_postmeta
В таблице wp_postmeta медиафайлу соответствует несколько записей с общим значением в поле post_id. Записи отличаются значением мета-ключа в поле meta_key и специфическим назначением значения meta_value:
post_id | meta_key | meta_value:Comment |
---|---|---|
<ID> | '_wp_attachment_metadata' | сериализация php-структуры с описанием оригинального медиафайла и его дополнительных вариаций вида: 'a:5:{s:5:"width";i:1600;s:6:"height";i:1200;s:4:"file";s:8:"demo.svg";s:5:"sizes";a:9:{...}}' |
<ID> | '_wp_attached_file' | имя файла с расширением без пути ('demo.svg') |
<ID> | '_wp_attachment_image_alt' | альтернативный текст (Alternative Text) отобразится на странице вместо медиафайла, если файл не удастся загрузить |
<ID> | '_edit_last' | ? счетчик изменений |
<ID> | '_edit_lock' | '<time stamp>:<user_id>' при интерактивном редактировании медиафайла записывается метка времени и ID пользователя, редактирующего медиафайл, для защиты от конкурентного редактирования другим пользователем |
Навигационные меню
Навигацию по рубрикам, постам и страницам сайта реализуют в виде меню, число и расположение которых, определяется активной темой сайта. Однако общее число меню навигации базе WordPress не ограничено. Каждое меню может включать произвольное число видимых элементов верхнего уровня и произвольное число подуровней из произвольного числа других элементов. Заголовки меню, элементы меню, их имена, порядок, вложенность и назначение распределены по нескольким таблицам. Схема ниже отражает:
- красным - критерии полей, принадлежащих записям заголовков или элементов меню
- синим - связи отношений таблиц
- желтым - поля значения которых влияют на функционирование меню
В соответствии с моделью отношений элементов меню, полная выборка данных всех элементов всех меню сайта можно получить sql-выражением:
1 2 3 4 5 6 7 8 9 10 11 12 |
SELECT wp_term_taxonomy.term_taxonomy_id, wp_term_taxonomy.taxonomy, wp_term_taxonomy.description, wp_term_taxonomy.parent, wp_terms.name, wp_terms.slug, wp_terms.term_group, wp_term_relationships.term_order, wp_posts.ID, wp_posts.post_author, wp_posts.post_content, wp_posts.post_title, wp_posts.menu_order, wp_postmeta.meta_key, wp_postmeta.meta_value FROM (((wp_terms INNER JOIN wp_term_taxonomy ON wp_terms.term_id = wp_term_taxonomy.term_id) INNER JOIN wp_term_relationships ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id) INNER JOIN wp_posts ON wp_term_relationships.object_id = wp_posts.ID) INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id WHERE wp_term_taxonomy.taxonomy='nav_menu' ORDER BY wp_term_taxonomy.term_taxonomy_id, wp_posts.menu_order, wp_postmeta.meta_key; |
Приведенный запрос подходит для наглядной демонстрации, но в практическом смысле малополезен, поэтому ниже подробно описаны отдельные связи и их практическое использование.
Заголовки навигационных меню
Меню является термином, поэтому заголовки меню хранятся в таблице wp_terms с остальными терминами. Чтобы найти идентификатор термина, соответствующего заголовку меню, следует в таблице wp_term_taxonomy выбрать записи, в которых поле taxonomy имеет значение 'nav_menu'.
Пример запроса выбирает все существующие меню:
1 2 3 |
SELECT wp_terms.term_id, name, slug, taxonomy FROM wp_terms, wp_term_taxonomy WHERE wp_terms.term_id=wp_term_taxonomy.term_id AND taxonomy='nav_menu'; |
В прочем, получение заголовков навигационных меню существенной пользы не дает, поскольку заголовки меню отображаются только в консоли для редактирования и выбора меню используемого сайтом. Описанное в этом разделе имеет значение, только если необходимо создать или переименовать навигационное меню .
Активные меню
Меню сайта отображаются активной темой, которая задана в таблице wp_options значением поля option_value в записи, где поле option_name имеет значение 'template'. Затем, необходимо получить настройки активной темы, которая хранится аналогично в записи, где поле option_name имеет значение имени активной темы с префиксом 'theme_mods_'.
Пример запроса получает имя шаблона активной темы и строку ее настроек:
1 2 3 4 5 6 |
SELECT @template AS template, option_value FROM wp_options WHERE option_name = CONCAT('theme_mods_', (SELECT @template:=option_value FROM wp_options WHERE option_name = 'template')); |
Полученное значение option_value является php-сериализацией структуры настроек активной темы, которая содержит в своем фрагменте php-массив вида:
1 |
...;a:2:{s:7:"primary";i:123;s:9:"secondary";i:456;}... |
Массивы настроек для различных тем отличаются по структуре, поэтому алгоритм их анализа должен основываться на имени шаблона темы.
Приведенный пример является фрагментом массива настроек темы Twentyfourteen. В этом массиве значение ['primary'] содержит идентификатор меню, которое используется в качестве основного, а ['secondary'] содержит идентификатор дополнительного меню. Подробное описание php-сериализации приведено в публикации СЕРИАЛИЗАЦИЯ И ДЕСЕРИАЛИЗАЦИЯ В ФОРМАТЕ PHP ДЛЯ 1С:ПРЕДПРИЯТИЕ 8.Х, но если не вдаваться в детали, то строковые значения идентификаторов следуют сразу после 's:7:"primary";i:' и 's:9:"secondary";i:' (в примере они равны 123 и 456 соответственно). При необходимости значения идентификаторов можно без риска перезаписать другими значениями и записать в настройку. Например:
1 2 3 |
UPDATE wp_options SET option_value = '<модифицированный массив настроек>' WHERE option_name = 'theme_mods_twentyfourteen' |
.
Элементы меню
Все элементы всех меню хранятся в таблице wp_posts в записях, у которых поле post_type имеет значение 'nav_menu_item'. Принадлежность элементов к каждому меню определяется полем object_id таблицы wp_term_relationships в записях, где term_taxonomy_id равен идентификатору термина меню, при этом поле menu_order определяет сквозной порядок элементов (без учета иерархии):
1 2 3 4 5 6 7 |
SELECT id, post_content, post_title, menu_order FROM wp_posts WHERE id in (SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id = @term_id) ORDER BY menu_order; |
Метаданные определяющие иерархию и тип элементов меню хранятся в таблице wp_postmeta, где для каждого элемента меню хранится несколько (обычно 8) записей, отличающихся по назначению полем meta_key.
1 2 3 4 5 6 7 |
SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id in (SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id = @term_id) ORDER BY post_id, meta_key; |
Название элемента в меню навигации зависит от типа элемента, задаваемого значениями поле meta_value в записях '_menu_item_type' и '_menu_item_object'.
Значения полей элементов меню в таблице wp_posts
Важные поля жирно выделены, обязательные поля с предопределенными значениями отмечены (∗):
wp_posts.<field> | Описание значения |
---|---|
ID | идентификатор элемента меню, обычно устанавливается автоматически, соответствует значениям wp_postmeta.post_id и wp_term_relationships.object_id |
post_author | содержит user_id пользователя создавшего элемент, по умолчанию содержит 0 |
post_date, post_date_gmt | даты создания элемента, желательно установить их значениями NOW(), UTC_TIMESTAMP() при правильно установленном time_zone |
post_content | содержит описание связанного объекта (не всегда)
|
post_title | надпись элемента меню (не всегда)
|
∗ post_excerpt | должно быть установлено '' |
post_status | по умолчанию содержит 'publish' |
∗ comment_status | должно быть установлено 'closed' |
∗ ping_status | должно быть установлено 'closed' |
post_name | содержание варьируется по неочевидному принципу
|
∗ to_ping | должно быть установлено '' |
∗ pinged | должно быть установлено '' |
post_modified, post_modified_gmt | даты последнего изменения элемента, желательно установить их значениями NOW(), UTC_TIMESTAMP() при правильно установленном time_zone |
∗ post_content_filtered | должно быть установлено '' |
post_parent | по умолчанию устанавливается 0, но иногда содержит число... |
guid | url элемента, по умолчанию '' |
menu_order | сквозной порядковый номер элемента в меню влияет на порядок следования элементов |
post_type | должен содержать 'nav_menu_item' |
///
Значения полей метаданных элементов меню в таблице wp_postmeta
Основные значения метаданных приведены в таблице:
meta_key (строковое значение) | meta_value (строковое значение) |
---|---|
'_menu_item_type' | определяет тип элемента меню
|
'_menu_item_object' | определяет тип объекта в зависимости от значения _menu_item_type
при _menu_item_type='taxonomy':
при _menu_item_type='post_type':
при _menu_item_type='custom':
|
'_menu_item_menu_item_parent' | id родительской записи элемента многоуровневого меню |
'_menu_item_object_id' | id идентификатора (рубрики, страницы или поста, в зависимости от типа элемента и объекта) |
'_menu_item_url' | url-ссылка (если _menu_item_type и _menu_item_object содержат 'custom') |
'_menu_item_classes' | в известных случаях всегда содержит сериализацию 'a:1:{i:0;s:0:"";}' |
'_menu_item_target' | в известных случаях всегда пусто |
'_menu_item_xfn' | в известных случаях всегда пусто |
///
Практика применения прямого доступа к DB
Важно понимать и помнить, что используя прямой доступ к DB, вы обходите все возможности WordPress проконтролировать эти действия, поэтому любые непосредственные изменения несут определенную долю риска, который вы принимаете на свою ответственность.
Опции wp_options
Все установленные темы хранятся в записи, у которой option_name = "_site_transient_theme_roots", а набор установленных тем находятся в текстовом option_value в виде сериализации php-массива.
Настройки каждой установленной темы хранятся в записи, у которых option_name имеет префикс "theme_mods_...", а сами настройки находятся в текстовом option_value в виде сериализации php-массива. Запись с настройками может оставаться в таблице и после удаления темы, поэтому следует просмотреть все хранимые настройки sql-выражением:
1 2 3 |
SELECT * FROM wp_options WHERE option_name LIKE 'theme_mods_%'; |
Профилактическую оценку общего объема данных, автоматически загружаемых каждой страницей, важно выполнять для оценки нагрузки и производительности сайта. Выполняется это sql-выражением:
1 2 3 |
SELECT SUM(LENGTH(option_value)) AS autoload_values_length FROM wp_options WHERE autoload='yes'; |
Выражение для оценки объема каждой опции в порядке убывания размера и значимости позволит выявить источники перегрузки.
1 2 3 4 |
SELECT option_name, LENGTH(option_value) AS autoload_value_length FROM wp_options WHERE autoload='yes' ORDER BY LENGTH(option_value) DESC; |
Публикации
Просмотреть заголовки измененных публикаций за N дней (INTERVAL 1 DAY):
1 2 |
SELECT id, post_type, post_status, post_title, post_modified FROM wp_posts WHERE post_type in ('post','page') AND post_modified >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) ORDER BY post_modified |
Удалить все ревизии всех публикаций
1 |
DELETE FROM wp_posts WHERE post_type = 'revision' |
Комментарии
Все спам-комментарии можно удалить зная о дурацкой черте спамеров начинать пост тэгом <strong>. Выражение удаления комментариев по признаку "<strong>..."
1 2 |
DELETE FROM wp_comments WHERE comment_content LIKE '<strong>%'; |
Если утрата этого "культурного наследия" недопустима, то для чтения перед сном их можно переложить в радел "Спам", руководствуясь тем же критерием:
1 2 3 |
UPDATE wp_comments SET comment_approved = 'spam' WHERE comment_approved = '1' AND comment_content LIKE '<strong>%'; |
Шифрование
Этот раздел здесь находится временно до того момента, когда все детали не будут установлено окончательно.
Поле wp_users.user_pass содержит хэш пароля вида $P$BOvQYoHxOvq5BcQIIBeuCR0er.xA3B1. К настоящему момент удалось понять:
- $P$ - указывает на открытый Portable PHP password hashing framework //www.openwall.com/phpass/
- где доступны исходные тексты и примерами на C и PHP
- Класс хеширования WordPress PasswordHash не описан, но есть полный исходник на //wp-kama.ru
- Упоминаются различные алгоритмы шифрования, которые используют чуть отличную сигнатуру и определяют структуру на https://asecuritysite.com/encryption/phpass
- описана структура $P$BOvQYoHxOvq5BcQIIBeuCR0er.xA3B1
- за сигнатурой следует параметр шифрования (иногда это степень числа циклов, но в этом случае это что-то другое)
- 8 символов играют роль Salt соли
- 16 символов - это 128 бит хэш
- назначение еще 6 символов не понятно
- описана структура $P$BOvQYoHxOvq5BcQIIBeuCR0er.xA3B1
- в WordPress ответственный файл /public_html/wp-includes/pluggable.php содержит:
- //$check = $wp_hasher->CheckPassword( $password, $hash );
- установить принадлежность сигнатуры $P$B не удалось, но было подозрение, что это - BCrypt
- документация к PHP 7 описывает применение функции password_hash ( string $password , int $algo [, array $options ] ) : string https://www.php.net/manual/ru/function.password-hash.php
- Хэширование паролей в PHP 5.5 с использованием нового API + разные ссылки на //habr.com
- небольшое обсуждение примера на WordPress '123456' -> '$P$BOvQYoHxOvq5BcQIIBeuCR0er.xA3B1'
- рабочий пример:
12$wp_hasher = new PasswordHash(8, TRUE);$check = $wp_hasher->CheckPassword("123456", '$P$BOvQYoHxOvq5BcQIIBeuCR0er.xA3B1');
- рабочий пример:
- (продолжение следует)
Источники
- Официально: Описание структуры базы данных на //codex.wordpress.org
- Официально: Справочник по функциям на //codex.wordpress.org
- Управление базой данных WordPress с помощью phpMyAdmin – инструкция для начинающих на //www.coma.lv
- Записи в WordPress на //wp-kama.ru
- Метаданные в WordPress на //wp-kama.ru
- Таксономии в WordPress на //wp-kama.ru
- Опции WordPress (полный список) на //wp-kama.ru
- Как работают уведомления (пинги, трэкбэки) в WordPress на //wp-kama.ru
- Интеграция 1С и CMS WordPress посредством Rest API сайта
- Интеграция 1С с сайтом (магазином) WordPress (WooCommerce) с помощью Rest API сайта. Часть 1. Авторизация //infostart.ru
- Первый шаг //infostart.ru
- Шаг второй, публикация картинок //infostart.ru
- Шаг третий, WooCommerce, публикация категорий товаров //infostart.ru
я потрясен прочитанным!