WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Получай пассивный доход от сайта с помощью браузерных PUSH уведомлений

Записи в WordPress

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

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

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

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

Записи в WordPress

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

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

Структура полей таблицы wp_posts и их индексы

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

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

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

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

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

Теперь, давайте взглянем на все типы записей, которые регистрируются в WordPress по умолчанию, см. create_initial_post_types():

Название типа Название Описание
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_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» думаю можно закончить и перейти к другим важным знаниям, которые связаны с записями.

меню

Дополнительные данные записей (метаданные)

Задачи при разработке могут быть самыми разными и имеющихся полей в таблице 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

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

Для управления метаполями в коде темы или плагина, существуют специальные функции:

Функция Описание
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' );

Эти хуки срабатывают из wp_insert_post() > sanitize_post() > sanitize_post_field().

20 комментов
Полезные 1 Вопросы 2 Все
    Войти