Метабоксы - это полезная функция для WordPress, которая позволяет добавлять полностью персонализированные данные в сообщение или страницу в WordPress.

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

Обычно настраиваемые метабоксы содержат данные и поля из форма, которые позволяют администраторам добавлять/изменять/удалять метаданные.

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

Что такое мета-бокс или мета-бокс?

Мета-поле - это перетаскиваемый раздел, отображаемый на экране редактирования содержимого WordPress. Пользователи могут выбрать или ввести дополнительную информацию в мета-поля в дополнение к содержанию статьи.

В мета-поля можно вводить два типа данных: метаданные (то есть настраиваемые поля) и термины таксономии.

Как добавить мета-зону

В WordPress есть функция под названием  add_meta_box для конкретной цели добавления нового мета-блока.  Add_meta_box должен вызываться внутри функции обратного вызова, которая должна выполняться при загрузке мета-боксов. Эту задачу можно выполнить с помощью «крючка». add_meta_box_{format de publication}как предложено в Кодекс .

При этом мы добавим следующий код в файл основная часть плагина или тема в файле function.php (помня, что всегда лучше создать дочернюю тему, а не изменять файл functions.php темы):

<?php
/**
 * Добавить мета-бокс
 *
* Параметр сообщения $post Объект сообщения.
* ссылка https://codex.wordpress.org/Plugin_API/Action_Reference/add_meta_boxes
 * /
функция food_add_meta_boxes ($post) {
    add_meta_box('food_meta_box', __('пищевая ценность', 'food_example_plugin'), 'food_build_meta_box', 'еда', 'боковой', 'низкий');
}
add_action('add_meta_boxes_food', 'food_add_meta_boxes');

Это наш первый персональный метабокс. В приведенном выше коде мы передаем шесть аргументов функции add_meta_box : документ, удостоверяющий личность для метабокса, заголовок, функция обратного вызова, ярлык типа настраиваемой рекламы ( food), Контекст ( сторона ) и приоритет ( low).

Функция обратного вызова печатает разметку HTML в мета-поле, и мы определим ее следующим образом:

<? PHP
/**
 * Создайте собственное поле мета-поля.
 *
* param $post post Объект сообщения
 * /
функция food_build_meta_box ($post) {
 // Наш код здесь
}

HTML-контент еще не распечатан, но мета-поле уже на месте. Итак, перейдем к подробностям.

empty_custom_meta_box

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


wp_nonce_field (базовое имя (__FILE__), 'food_meta_box_nonce');

Здесь мы передали функции только два из четырех допустимых аргументов. Первый - это имя действия, здесь установлено имя базовой папки текущего файла, а второй аргумент - это имя атрибута скрытого поля. Даже если поле nonce не гарантирует абсолютную защиту, рекомендуется всегда включать его в любое настраиваемое мета-поле (установите флажок WordPress Кодекс для более подробного объяснения).

Когда мы закончим с безопасностью, нам нужно извлечь значения настраиваемых полей из базы данных и управлять полями мета-поля. Здесь функция get_post_meta  становится очень практичным.

В нашем примере (или файл "Функции", в зависимости от того, как вы хотите реализовать пример в этом руководстве) мы используем три простых настраиваемых поля, две строки и массив. В приведенном ниже коде показано, как ввести их значения в базу данных:

ID, '_food_cholesterol', true); // получить текущее значение _food_carbohydrates $ current_carbohydrates = get_post_meta ($ post-> ID, '_food_carbohydrates', true); // хранит массив _food_vitamins $ current_vitamins = (get_post_meta ($ post-> ID, '_food_vitamins', true))? get_post_meta ($ post-> ID, '_food_vitamins', истина): array ();

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

Наконец, пришло время распечатать разметку.

Поля формы печати

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

?> " />

В предыдущем коде само настраиваемое поле предоставило значение текущего поля. Следующее настраиваемое поле будет иметь две радиокнопки:

/> Да /> Нет

Так что здесь все становится немного сложнее. Функция проверил сравните две строки, переданные в качестве аргументов. Если есть совпадение, то поле будет активировано «отмечено».

Наконец, мы добавим группы меток в мета-боксы:

/> Витамин А  /> Тиамин (B3)

Значение атрибута name совпадает с элементом массива, и в дальнейшем это позволит нам более эффективно сохранять данные.

Теперь рассмотрим первый аргумент "проверенной" функции.

<?php
( in_array('Тиамин (B1)', $current_vitamins)) ? «Тиамин (B1)»: «»

это тернарная операция, которая проверяет, идентично ли текущее значение флажка переменной " $ current_vitamins". Если условие истинно, то возвращается то же значение, иначе возвращается пустая строка.

Теперь, когда логика должна быть ясна, мы можем сократить код с помощью массива в цикле «foreach»:

ID, '_food_vitamins', правда))? get_post_meta ($ post-> ID, '_food_vitamins', истина): array (); ?> " />

Теперь давайте соберем все вместе:

ID, '_food_cholesterol', true); // получить текущее значение _food_carbohydrates $ current_carbohydrates = get_post_meta ($ post-> ID, '_food_carbohydrates', true); $ Vitamins = array ('Витамин A', 'Тиамин (B1)', 'Рибофлавин (B2)', 'Ниацин (B3)', 'Пантотеновая кислота (B5)', 'Витамин B6', 'Витамин B12', ' Витамин С »,« Витамин D »,« Витамин Е »,« Витамин К »); // хранит массив _food_vitamins $ current_vitamins = (get_post_meta ($ post-> ID, '_food_vitamins', true))? get_post_meta ($ post-> ID, '_food_vitamins', истина): array (); ?> /> Да /> Нет " />" />

И это то, что готовый мета-бокс будет собирать в интерфейсе редактирования.

food_meta_box

Как сохранить данные

Теперь, когда мета-поле готово, сохранить данные невозможно. Для этого нам нужно определить функцию обратного вызова, которая будет вызываться при сохранении публикации / страницы:

<?php
/**
 * Хранить данные мета-поля настраиваемого поля.
 *
 * @param int $post_id Идентификатор сообщения.
 */
функция food_save_meta_boxes_data($post_id){
 // здесь код
}
add_action('save_post_food', 'food_save_meta_boxes_data', 10, 2);

Хук "save _ {$ post_type}" выполняется, когда пользовательский тип сообщения сохраняется или обновляется.

Теперь давайте посмотрим, как делать что-то внутри этой функции. Первое, что нам нужно сделать, это проверить, что значение поля «nonce».

<?php
// проверяем метабокс nonce
if ( !isset( $_POST['food_meta_box_nonce'] ) || !wp_verify_nonce( $_POST['food_meta_box_nonce'], basename( __FILE__ ) ) ){
 возвращаться;
}

Если поле nonce не определено, или если его значение неверно или истекло, выполнение прерывается более чем на подробности здесь.

Если вы хотите пропустить функцию в случае автосохранения, мы можем добавить следующее условие:


Далее нам нужно проверить роль пользователя:

<?php
// Проверяем права пользователя.
if ( ! current_user_can('edit_post', $post_id)){
 возвращаться;
}

и наконец мы сохраняем данные:

<?php
// сохраняем значения пользовательских полей
// строка холестерина
if ( isset( $_REQUEST['холестерин'] ) ) {
 update_post_meta($post_id, '_food_cholesterol', sanitize_text_field($_POST['холестерин']));
}
// сохраняем значения пользовательских полей
// строка углеводов
if ( isset( $_REQUEST['углеводы'] ) ) {
 update_post_meta($post_id, '_food_carbodrives', sanitize_text_field($_POST['carbodrives']) );
}
// сохраняем значения пользовательских полей
// массив витаминов
if( isset( $_POST['витамины'] ) ){
 $vitamins = (массив) $_POST['витамины'];
 // синитизировать массив
 $vitamins = array_map('sanitize_text_field', $vitamins);
 // сохранить данные
 update_post_meta($post_id, '_food_vitamins', $vitamins);
}еще{
 // удаляем данные
 delete_post_meta($post_id, '_food_vitamins');
}

Если в массиве существует хотя бы один элемент, то переменная $ vitamins будет сохранена с соответствующим значением. Позже функция PHP array_map применит функцию sanitize_text_field к каждому элементу массива. Если для параметра не установлен флажок, тогда массив $ _POST ['vitamins'] не будет существовать, поэтому мы можем удалить его, вызвав функцию "delete_post_meta".

Вот полный код:


Это код, собранный в плагине, который вы можете скачать с Github.

Резюме

Теперь, когда мы знаем, как создать метабокс, вы можете продолжить практиковаться, создав формы на вашей приборной панели. В HTML5 появились новые поля, и вы можете экспериментировать с ними, используя поле даты или цвета.

У вас будет гораздо больше возможностей при использовании jQuery UI или другой доступной библиотеки. Это руководство лишь поверхностно и дает вам обзор возможностей. Остальная работа будет зависеть от вашего желания учиться.

Это все для этого урока. Не стесняйтесь делиться ею с друзьями или оставлять предложения в комментариях.