Записи (пости) у 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 | Запити зміни персональних даних () |
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 | Тільки створений пост, без заголовка, контенту та іншої інформації. |
future | Запис запланований до публікації у майбутньому. |
private | Запис не доступний не авторизованим користувачам. |
inherit | Ревізія чи вкладення (revision or attachment). Дивіться get_children() . |
trash | Запис, що знаходиться в кошику. |
Функції, пов’язані зі статусом запису (повний список дивіться тут ):
Функція | Опис |
---|---|
get_post_status_object() | Отримує об’єкт даних вказаного статусу запису (поста). |
is_post_status_viewable() | Визначення, десь після post status is consideraed “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 | Ярлик запису. Назва, яка використовується в 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
.
нотатки
Очищення контенту запису (посту)
Контент та уривок запису перед збереженням у бд очищається функцією (field_no_prefix)_save_pre :
add_filter( 'content_save_pre', 'wp_filter_post_kses'); add_filter( 'excerpt_save_pre', 'wp_filter_post_kses');
Ці хуки спрацьовують із sanitize_post_field() .