WordPress как на ладони
wordpress jino

Записи в WordPress

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

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

Теперь, по порядку...

Читайте также, как устроены таксономии в WordPress.

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

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

Записи в WordPress

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

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

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

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

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

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

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

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

Теперь, давайте взглянем на все виды записей, которые содержит таблица wp_posts:

Название Название типа Описание
Посты post Базовые записи WP
Страницы page Постоянные Страницы WP
Произвольные типы любое имя Записи создаваемые с помощью register_post_type()
Вложения attachment Медиафайлы WP: картинки, аудио, видео
Элементы меню nav_meny_item Встроенный тип WP, для меню
Ревизии revision Встроенный тип WP, для копий редактирования статьи (редакций записи)

Также, чтобы не оставалось лишних вопросов, разберем каждое поле таблицы 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).

Также, для управления метаполями у меня есть класс Kama_Post_Meta_Box. И есть плагины: «Custom Field Suite» и «Advanced Custom Fields» и др.

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

Связи записей (родители и таксономии)

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

  • Древовидные записи связываются друг с другом как родительские и дочерние. И они не имею связь с рубриками (таксономиями). Древовидная связь записывается в поле post_parent таблицы wp_posts.

  • Не древовидные (линейные) записи связываются друг с другом через рубрики, метки и произвольные таксономии. При этом поле post_parent у них всегда равно 0 и не используется.

Подробное объяснение, что такое таксономии в WordPress.

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

Как записи WordPress связываются между собой

Связи в нестандартных типах записей:

  • Элементы меню - используют логику древовидных записей для связи между собой.
  • Ревизии и Вложения - прикрепляются к родительской записи через поле post_parent таблицы wp_posts.
Записи в WordPress 9 комментариев
  • campusboy1847 cайт: wp-plus.ru

    Отличный мануальчик для тех, кто начинает постигать WP и хочет узнать основные правила по этой теме. Даже добавить нечего. Разве что о том, что произвольное поле, имя которого начинается с нижнего подчёркивания воспринимается движком как скрытое и по умолчанию в админке не отображается (когда-то набил на этом шишки).

    2
    Ответитьгод назад #
    • Kama4464

      Спасибо! Про метаполя я еще планирую написать, там все это будет...

      1
      Ответитьгод назад #
      • campusboy1847 cайт: wp-plus.ru

        С нетерпением буду ждать. Кстати, а как отображать базу так, как это сделано на скриншотах? Довольно показательно.

        Ответитьгод назад #
        • Kama4464

          Это я собрал скрины, сделанные из десктопной проги HeidiSQL, которая идет в комплекте с Open Server...

          2
          Ответитьгод назад #
          • campusboy1847 cайт: wp-plus.ru

            Похоже пора обновится, нет такой программы там. Блин, его обновлять такой геморой smile зато php7 будет.

            Ответитьгод назад #
            • Kama4464

              Она там давно уже, смотри: Дополнительно > mysql менеджер...

              3
              Ответитьгод назад #
              • campusboy1847 cайт: wp-plus.ru

                Спасибо, точно! Всегда туда заходил и не понимал, что дальше. Потыкал и открылась программа полноценно. По ходу крутая вещь, полностью заменяет phpmyadmin?

                Ответитьгод назад #

Здравствуйте, !

Ваш комментарий