Записи (посты) в WordPress
В этой статье поговорим о записях ВордПресс, точнее о том, как устроена их структура в движке. В сети есть информация о том, что такое записи и чем они отличаются от страниц. Например, вот статья на эту тему - статья отличная, но для новичков, а если копнуть глубже, то на эту тему можно поговорить еще.
Первое что нужно сделать — это разделить понятие «Запись» на узкое и широкое. Забегая вперед скажу, что в текущей структуре WordPress (где WP - это скорее конструктор, а не блоговый движок), называть посты записями - это не совсем правильно... Я понимаю, что в русском слово «пост» - это англицизм, но когда посты называют записями, и новые типы записей тоже называют записями - это определенно усложняет понимание. К примеру, фразу «нужно создать запись», можно понять как «создать публикацию» или «создать новый тип-записи в структуре WordPress». В такой ситуации, когда юный разработчик еще нехорошо понимает как и что работает, он обязательно запутается. Поэтому, давайте, посты (записи типа post) будем называть постами, а «запись» пусть будет собирательным названием для всех видов типов записей - строка (запись) в таблице wp_posts.
Смотрите также:
- Таксономии в WordPress
- Мета-поля в WordPress
- register_post_type() - регистрирует тип записи.
- get_post_type_object() - получает данные типа записи.
Запись в узком смысле
Это публикация записи с типом post, который существует в WordPress сразу после установки. Он прикрепляется к рубрикам или меткам. Таким «записям» можно противопоставить «страницы» (публикация записи с типом page).

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

Так как все элементы находится в одной таблице - они имеет одинаковые данные, а значит технически записи не сильно друг от друга отличаются. Я бы выделил 3 основных различия:
-
Древовидная структура. Одна запись может быть дочерней или родительской к другой. Такой структурой обладают постоянные страницы.
-
Название типа записи. Каждый тип записи имеет свое название: посты называются
post
, страницыpage
, произвольно созданные типы называются так как их назвали, напримерportfolio
...Я выделил это различие, потому что поле
post_type
в таблицеwp_posts
индексное. Поэтому образно можно сказать, что тип разделяет таблицу на отдельные таблицы по типу записей, т.е. во время запроса по выборке записей, WordPress очень быстро «урезает» таблицу до указанного типа записей и работает только с этим типом. - Встроенные типы записей. К ним относятся все нестандартные типы записей: «ревизии» (редакции), «элементы меню» (произвольное меню), «вложения (медиафайлы)». Т.е. это записи которые используются и обрабатываются в WordPress по особенному.
Дефолтные Типы записей (post_type)
Следующие типы записей регистрируются в WordPress по умолчанию.
Название типа | Название | Описание |
---|---|---|
post |
Записи (Посты) | Записи WP. |
page |
Страницы | Постоянные Страницы WP. |
любое_имя |
Произвольные типы | Записи создаваемые с помощью register_post_type(). |
attachment |
Вложения | Медиафайлы WP: картинки, аудио, видео. |
nav_menu_item |
Элементы меню | Встроенный тип WP, для меню. |
revision |
Ревизии | Встроенный тип WP, для копий редактирования статьи (редакций записи). |
oembed_cache |
oEmbed Responses | Ответы за запросы oEmbed. |
custom_css |
Custom CSS | CSS стили указанные в кастомайзере. См. wp_get_custom_css_post() |
customize_changeset |
Changesets | Настройки кастомайзера. |
user_request |
User Requests | Запросы при изменении персональных данных на странице админки tools. См. wp_create_user_request() |
wp_block |
Reusable Blocks | Блоки гутенберг. |
wp_template |
Шаблоны | Шаблоны для подключения в теме. (редактор блоков) |
wp_template_part |
Части шаблона | Части шаблона для подключения в теме. (редактор блоков) |
wp_global_styles |
Глобальные стили | Глобальные стили для подключения в теме. (редактор блоков) |
wp_navigation |
Меню навигации | Навигационные меню, которые можно вставить в сайт. |
Дефолтные записи регистрируются функцией create_initial_post_types().
Дефолтные Статусы записей (post_status)
Следующие статусы записей используются в WordPress из коробки.
Статус | Описание |
---|---|
publish |
Опубликованный пост (страница или тип записи). |
pending |
Запись на рассмотрении перед публикацией. |
draft |
Черновик записи - неопубликованная запись. |
auto-draft |
Только созданный пост, еще без заголовка, контента и другой информации. Хранится 7 дней затем авто-удаляется кроном - см. wp_delete_auto_drafts(). |
future |
Запись запланированная к публикации в будущем. |
private |
Запись не доступная не авторизованным пользователям. |
inherit |
Ревизия или вложение (revision or attachment). Смотрите get_children(). |
trash |
Запись находящаяся в корзине. |
Функции связанные со статусом записи (полный список смотрите здесь):
Функция | Описание |
---|---|
get_post_status_object() | Получает объект данных указанного статуса записи (поста). |
is_post_status_viewable() | Determines whether a post status is considered "viewable". |
get_post_statuses() | Возвращает массив следующих базовых статусов поста: Draft, Pending, Private, Publish. |
Каждое поле таблицы wp_posts
:
Поле | Значение | индекс |
---|---|---|
ID | ID записи | основной |
post_author | ID автора записи | post_author |
post_date | Дата создания записи (в диапазоне времени сайта) | type_status_date |
post_date_gmt | Дата создания записи (в GMT/UTC диапазоне) | - |
post_content | Контент записи (текст поста, страницы) | - |
post_title | Заголовок записи | - |
post_excerpt | Короткий текст записи (отрывок, выдержка, цитата) | - |
post_status | Статус записи (publish, inherit, trash) | type_status_date |
comment_status | Разрешено ли комментирование (open, closed) | - |
ping_status | Разрешены ли пинги (open, closed) | - |
post_password | Пароль для доступа к записи | - |
post_name | Ярлык (slug) записи. Название которое используется в URL | post_name |
to_ping | URL на которые нужно отправить пинг при публикации | - |
pinged | URL куда пинг был отправлен | - |
post_modified | Дата изменения записи (в диапазоне сайта) | - |
post_modified_gmt | Дата изменения записи (в GMT/UTC диапазоне) | - |
post_content_filtered | Временный контент записи. Подробнее | - |
post_parent | ID родительской записи | post_parent |
guid | Уникальный идентификатор записи. Для фидов. | - |
menu_order | Числовой порядок в меню | - |
post_type | Тип записи: post , page |
type_status_date |
post_mime_type | MIME тип записи. Для вложений: image/jpeg , video/mp4 |
- |
comment_count | Количество комментариев у записи. | - |
Как видно, есть общие поля для всех типов записей, например: post_type
, post_title
. Тогда как некоторые поля используются для одних типов, а другие для других. Например поле post_mime_type
используется только для вложений, поле post_parent
используется для древовидных типов записей, поля to_ping
и pinged
используются для записей с контентом, например: посты, страницы, произвольные типы.
Большое значение в этой таблице играют индексные поля: post_name
, post_parent
, post_author
, post_type + post_status + post_date
(составной индекс). Индексы нужны, чтобы ускорить запросы по выборке записей. Не буду вдаваться в подробности индексов, о них вы лучше почитайте в отличной статье: Индексы в MySQL.
На этом с понятием «записи в WordPress» думаю можно закончить и перейти к другим важным знаниям, которые связаны с записями.
Разница между post_content_filtered
и post_content
post_content_filtered
- место, где хранится временное содержимое. WordPress вообще не использует это поле, оно предназначено для плагинов. Оно устанавливается пустым каждый раз при обновлении поста, за исключением случаев, когда оно указано. То есть, если это поле указано при обновлении записи, то оно будет записано в БД, но если оно не будет указано при очередном обновлении, то оно будет стерто.
Подробный ответ на эту тему здесь: http://wordpress.stackexchange.com/questions/113387/when-is-the-post-content-filtered-column-in-database-cleared-by-wordpress
Мета-данные: Дополнительные данные записей
Задачи при разработке могут быть самыми разными и имеющихся полей в таблице wp_posts
всегда нахватает. Поэтому для расширения возможностей, любая запись в WordPress, т.е. любая строка в таблице wp_posts
может иметь дополнительные данные и они могут быть какими угодно - произвольными. Такие данные называются: метаданные, их еще называют мета-поля, произвольные поля, кастомные поля и бог знает как еще.
Все метаданные записей хранятся в таблице wp_postmeta
:
Поле | Значение | Индекс |
---|---|---|
meta_id | ID метаполя. Обычно нигде не используется... | основной |
post_id | ID записи из таблицы wp_posts. | post_id |
meta_key | Ключ метаполя. | meta_key |
meta_value | Значение метаполя. Всегда строка, массивы хранятся в сериализованном виде | - |
Для записей типа post, page метаполями можно управлять на странице редактирования записи:
Заметки по мета-полям (произвольным полям)
-
У ревизий метаданных нет.
-
Мета-поле, имя которого начинается с нижнего подчёркивания (
_
) воспринимается движком как скрытое и по умолчанию в админке не отображается.Так например в ВП для записей есть следующие служебные метаполя:
_wp_page_template
— сохраняется название php файла шаблона, если для страницы был указан файл шаблона._edit_lock
— записывается метка времени и ID пользователя, который редактирует запись._edit_last
— ID пользователя, который последним правил запись._thumbnail_id
— ID миниатюры записи (вложения).
-
Для управления метаполями у меня есть класс Kama_Post_Meta_Box. Также есть более мощные плагины:
- Advanced Custom Fields
- Carbon Fields
- Custom Field Suite
- и др.
- Подробнее про метаданные WordPress
Функции метаполей поста
Для управления метаполями в коде темы или плагина, существуют специальные функции:
get_post_meta() | Получает значение произвольного поля записи (поста). Позволяет также получить все метаполя. |
add_post_meta() | Добавляет произвольное поле для указанной записи (поста). |
update_post_meta() | Обновляет указанное произвольное поле (метаполе) указанной записи (поста) или добавляет новое. |
delete_post_meta() | Удалят все произвольные поля (метаполя) с указанным ключом у указанной записи (поста). |
get_post_custom() | Получает многомерный массив с данными всех произвольных полей текущего поста. |
get_post_custom_keys() | Получает массив с ключами произвольных полей, принадлежащих текущей записи. |
get_post_custom_values() | Получает массив значений произвольных полей с указанным названием у указанной записи (поста). |
the_meta() | Выводит произвольные поля записи (метаданные из wp_postmeta). Поля выводятся в списке <li>. Скрытые поля игнорируются. |
Связи записей (родители и таксономии)
Так как любой контент для удобного чтения должен быть структурирован, записи можно связывать между собой:
-
Древовидные записи связываются друг с другом как родительские и дочерние. И они не имею связь с рубриками (таксономиями). Древовидная связь записывается в поле
post_parent
таблицыwp_posts
. - Не древовидные (линейные) записи связываются друг с другом через рубрики, метки и произвольные таксономии. При этом поле
post_parent
у них всегда равно 0 и не используется.
Подробное объяснение, что такое таксономии в WordPress.
Схематически это выглядит как-то так:
Связи в нестандартных типах записей:
- Элементы меню - используют логику древовидных записей для связи между собой.
- Ревизии и Вложения - прикрепляются к родительской записи через поле
post_parent
таблицыwp_posts
.
Заметки
Очистка контента записи (поста)
Контент и отрывок записи перед сохранением в бд очищается функцией wp_filter_post_kses(), которая повешена на хук (field_no_prefix)_save_pre:
add_filter( 'content_save_pre', 'wp_filter_post_kses' ); add_filter( 'excerpt_save_pre', 'wp_filter_post_kses' );
Эти хуки срабатывают из wp_insert_post() > sanitize_post() > sanitize_post_field().