Як створити блок довільних полів (метабокс) в адмінці wordpress
Щоб вивести подібний блок для елементів таксономій, дивіться опис події: taxonomy-_edit_form_fields. Також дивіться відповідь на питання: метапол для рубрик (таксономій) в WordPress
Вступна частина
Перш ніж почати розповідати про те як створити довільний блок даних в адмін-панелі на сторінці редагування постів. який буде керувати зазначеними довільними полями, слід зазначити, що WordPress - платформа яка, мабуть, як ніяка інша піддається розширенню з найменшими зусиллями. Зокрема, саме тому під WordPress написано так багато плагінів - все дуже просто, потрібно лише знати ази PHP і розуміти принцип роботи системи.
Кожен, хто досить близько знайомий з WordPress неодноразово зустрічався з поняттям «довільні поля» і з їх допомогою вирішував деякі нетривіальні завдання.
Довільні поля в WordPress - дуже зручний інструмент, коли потрібно «прикріпити» до конкретного посту будь-які додаткові дані. Такими даними може бути що завгодно, починаючи від логічних true / false (1/0), закінчуючи об'ємними текстами, масивами і іншим. Наприклад, ми можемо створити нове довільне поле Title і в його значення написати текст (альтернативний заголовок поста), потім в коді шаблону використовувати наступний код, щоб вивести цей текст:
Слід зазначити, що функцію get_post_meta () можна використовувати за межами Циклу WordPress, тобто де завгодно в шаблоні. В даному прикладі ми використовуємо її в
частини документа, щоб дати html сторінці заголовок відмінний від заголовка самої статті (іноді корисно для SEO).
Інший приклад: використовуючи довільні поля ми можемо виконувати або не виконувати дії, в залежності від того, які дані у нас знаходиться в значенні довільного поля. Наприклад, розміщуючи в довільне поле логічні цифри 1 або 0 ми можемо виводити чи не виводити будь-яку інформацію для поточного поста.
Довільні поля використовуються в WordPress часто-густо, різними плагінами оцінки постів (WP-PostRatings), SEO плагінами (Platinum SEO Pack), що дозволяють вказати Title, Description, Keywords поста, моїм плагіном для створення мініатюр (Kama Thumbnail) і багатьма іншими плагінами. Образно кажучи, кожна четверта нестандартна завдання вирішується за допомогою довільних полів, тому якщо ви ще не знаєте як їх використовувати, то ознайомтеся з цим мануалом. А нижче ми поговоримо про те, як створити окремий блок з потрібними нам довільними полями і як зробити це без плагінів.
Мало хто знає, що якщо створити довільне поле ключ якого (назва) починається на _ (нижнє підкреслення), наприклад _my_special_key. то таке полі не буде виводитися в випадаючому списку довільних полів при редагуванні постів і буде вважатися "внутрішнім" довільним полем, яке використовується системою. Створити таке поле можна тільки запитом до БД, наприклад, використовуючи функції add_post_meta () або update_post_meta ().
Перш ніж почати створення
Припустимо, що ми робимо сайт на замовлення, і при цьому на сайті використовуються довільні поля. Пояснювати замовнику, яке поле вибирати зі списку, щоб додати ту чи іншу інформацію до посту, проблематично, до того ж це швидко забувається. Саме тому вже давно написані плагіни, завдяки яким можна легко створити блок довільних полів, де не потрібно вибирати поле (ключ), і тільки потім вписувати значення. У таких блоках потрібно відразу вписувати значення і є можливість описати кожне поле, при одному погляді на які стає зрозуміло його призначення. Блок, який ми зараз створимо буде виглядати так:

А дані такого блоку в самих довільних полях, після збереження поста, будуть записані так:

Що ми бачимо? - Непотрібні для сторонніх очей ключі довільних полів (про них я говорив вище), які до того ж потрібно ще й вибирати зі списку (а їх там може бути зовсім не 4, а куди більше.): Description. robotmeta. select і title. Зрозуміло, створити мета блок довільних полів - відмінна ідея.
Створюємо мета блок довільних полів
Для створення метаблока нам знадобляться всього 2 хука: add_meta_boxes і save_post. функція add_meta_box () і деякі знання html і php. Додаємо наступний код в файл теми functions.php:
# 1. Створимо новий мета блок для постів
Назвемо його "Додаткові поля":
# 2. Заповнимо цей блок полями html форми.
Всі назви полів я оформив в масив extra []. щоб потім простіше було обробити ці дані.
Заховані поле name = "extra_fields_nonce". потрібно для перевірки при збереженні даних.
На цьому етапі, ми вже створили блок довільних полів, тепер потрібно обробити дані полів при збереженні посади. Обробити, значить записати їх в в базу даних або видалити звідти. Для цього використовуємо хук save_post. який спрацьовує в момент збереження поста. У цей момент ми отримаємо дані з масиву extra [] і опрацюємо них:
Ось і все, блок довільних полів готовий!
Тепер, змінюючи html код, ми можемо редагувати вміст мета блоку. Але не забуваємо, що назви полів мають вигляд масиву зі значенням ключа довільно поля: name = "extra [meta_key]".
Весь код, цілком
Блок довільних полів для довільного типу записів
Якщо потрібно створити блок для іншого типу записів, припустимо page (для сторінок), то реєструємо ще один мета блок і описуємо його html код в новій функції, яку так само потрібно вказати при реєстрації блоку (extra_fields_box_page_func). Функцію обробки полів при збереженні поста створювати вже не треба, головне вказати назви полів у вигляді масивів extra []:
Складнощі з типом checkbox
Недоліком такого методу є те, що масив extra []. обов'язково повинен бути визначений, нехай навіть він передає пусте значення інакше полі не буде оброблено при збереженні даних. У зв'язку з цим, виникає проблема при використанні типу checkbox.
Щоб обійти цей "недугу" я зробив так: перед полем чекбокса створюємо hidden поле з name як у чекбокса і порожнім значенням. І виходить, якщо галочка стоїть, то значення hidden поля перебивається, якщо галки немає, то береться пусте значення hidden поля.
Тобто checkbox потрібно викликати так:
Такий же трюк іноді може стане в нагоді і для поля з типом radio.
Приклад реального коду з типами checkbox:
Простота в налаштуванні блоку довільних полів при створенні його таким способом виразно втрачається і я ні в якому разі не хочу сказати, що створювати блоки таким способом краще ніж використовувати плагіни. Однак, такий підхід більш гнучкий, тому що ми може створити абсолютно будь-які поля і розташувати їх як нам заманеться.
До того ж, зазвичай немає потреби створювати по кілька таких блоків і часто їх редагувати, як це можна робити використовуючи плагіни. Наприклад, на цьому блозі я використовую такий підхід і зовсім невеликий код в functions.php позбавляє мене від необхідності використовувати черговий плагін.
Модулі для створення блоків довільних полів
У статті я говорив про плагіни, які створюють мета блоки замінюють довільні поля, але жодного разу не згадав жоден. виправляюся:
Advanced Custom Fields (ACF) - мабуть, найпопулярніший і гнучкий плагін для створення довільних полів. З хорошою документацією.
Custom Field Suite - схожий на ACF тільки менш наворочений.
Custom Field Template - справжній комбайн. З ним можна створити будь-яку форму, для будь-яких типів постів, вказати форми для окремих посад і рубрик. Думаю в більшості випадків, можна обійтися без такого комбайна.
❮ Динамічний архів блогу з використанням jQuery (Ajax)