WordPress как на ладони
rgbcode is looking for WordPress developers.

Записи (посты) в WordPress

В этой статье поговорим о записях ВордПресс, точнее о том, как устроена их структура в движке. В сети есть информация о том, что такое записи и чем они отличаются от страниц. Например, вот статья на эту тему - статья отличная, но для новичков, а если копнуть глубже, то на эту тему можно поговорить еще.

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

Смотрите также:

Запись в узком смысле

Это публикация записи с типом post, который существует в WordPress сразу после установки. Он прикрепляется к рубрикам или меткам. Таким «записям» можно противопоставить «страницы» (публикация записи с типом page).

Записи в WordPress

Запись в широком смысле

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

Структура таблицы WordPress wp_posts

Так как все элементы находится в одной таблице - они имеет одинаковые данные, а значит технически записи не сильно друг от друга отличаются. Я бы выделил 3 основных различия:

  1. Древовидная структура. Одна запись может быть дочерней или родительской к другой. Такой структурой обладают постоянные страницы.

  2. Название типа записи. Каждый тип записи имеет свое название: посты называются post, страницы page, произвольно созданные типы называются так как их назвали, например portfolio...

    Я выделил это различие, потому что поле post_type в таблице wp_posts индексное. Поэтому образно можно сказать, что тип разделяет таблицу на отдельные таблицы по типу записей, т.е. во время запроса по выборке записей, WordPress очень быстро «урезает» таблицу до указанного типа записей и работает только с этим типом.

  3. Встроенные типы записей. К ним относятся все нестандартные типы записей: «ревизии» (редакции), «элементы меню» (произвольное меню), «вложения (медиафайлы)». Т.е. это записи которые используются и обрабатываются в 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:

postmeta-table

Поле Значение Индекс
meta_id ID метаполя. Обычно нигде не используется... основной
post_id ID записи из таблицы wp_posts. post_id
meta_key Ключ метаполя. meta_key
meta_value Значение метаполя. Всегда строка, массивы хранятся в сериализованном виде -

Для записей типа post, page метаполями можно управлять на странице редактирования записи:

custom-fields

Как включить метабокс произвольных полей в блочном редакторе Gutenberg?

Заметки по мета-полям (произвольным полям)

  • У ревизий метаданных нет.

  • Мета-поле, имя которого начинается с нижнего подчёркивания (_) воспринимается движком как скрытое и по умолчанию в админке не отображается.

    Так например в ВП для записей есть следующие служебные метаполя:

    • _wp_page_template — сохраняется название php файла шаблона, если для страницы был указан файл шаблона.
    • _edit_lock — записывается метка времени и ID пользователя, который редактирует запись.
    • _edit_last — ID пользователя, который последним правил запись.
    • _thumbnail_id — ID миниатюры записи (вложения).
  • Для управления метаполями у меня есть класс Kama_Post_Meta_Box. Также есть более мощные плагины:

  • Подробнее про метаданные 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.

Схематически это выглядит как-то так:

Как записи 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' );

Эти хуки срабатывают из

23 комментария
Полезные 2Вопросы 2 Все
    Войти