Создание блока настраиваемых полей в панели администратора WordPress
Содержание
- Введение
- Перед тем как начать
- Создание мета-блока для настраиваемых полей
-
1. Создание нового мета-блока для постов
-
2. Заполнение блока HTML-формами
-
3. Сохранение данных
-
- Блок настраиваемых полей для пользовательского типа записи
- Проблема с типом "Checkbox"
- Создание метабокса с помощью класса PHP
- Плагины для создания блоков настраиваемых полей
- Заключение
Если вы х��тите упростить создание настраиваемых полей, можете воспользоваться моим классом PHP, который удобен для создания мета-полей постов.
Введение
Перед тем как приступить к созданию мета-блока для настраиваемых полей, стоит отметить, что WordPress — это платформа, которая позволяет легко добавлять новые функции. Именно поэтому для WordPress написано так много плагинов: все очень просто, нужно лишь понимать основы PHP и, как работает система.
Любой, кто знаком с WordPress, сталкивался с понятием "настраиваемые поля" и использовал их для решения различных задач.
Что такое настраиваемые поля?
Настраиваемые поля в WordPress — это инструмент, позволяющий "прикреплять" дополнительные данные к конкретной записи. Эти данные могут быть любыми: от логических значений true/false (1/0) до длинных текстов и массивов.
Например, мы можем создать новое настраиваемое поле "Заголовок" и записать в его значение альтернативный заголовок поста, а затем в коде шаблона использовать следующий код для отображения этого текста:
Функция get_post_meta()
может использоваться где угодно в шаблоне или плагине, то есть вне цикла WordPress.
Еще один пример: используя настраиваемые поля, мы можем выполнять или не выполнять действия в зависимости от значения мета-поля. Например, если в настраиваемом поле указаны логические числа "1" или "0", то можно отобразить или скрыть некоторую информацию для текущего поста.
Перед тем как начать
WordPress имеет встроенный блок настраиваемых полей. Однако он часто оказывается неудобным, потому что для добавления поля нужно вводить ключ и значение, а описаний для каждого поля нет.
Гораздо удобнее иметь блок, в который можно просто вводить значения, а каждое поле имеет понятное имя и описание. Наш блок будет выглядеть так:
Примечание: Если вы создаете настраиваемое поле, чье имя начинается с символа подчеркивания "_", например "_my_special_key", то такое поле будет считаться "внутренним" и не будет отображаться в выпадающем списке настраиваемых полей в панели управления. Создавать такие поля можно только через запрос к базе данных, например, используя функции
add_post_meta()
илиupdate_post_meta()
.
Для редактора блоков (Гутенберг) вы также можете включить стандартный блок настраиваемых полей.
Создание мета-блока для настраиваемых полей
Чтобы создать мета-блок, нам понадобятся:
- Хук
add_meta_boxes
- Хук
save_post
- Функция
add_meta_box()
- Немного знаний HTML и PHP
Добавьте следующий код в файл functions.php
вашей темы или в плагин:
1. Создание нового мета-блока для постов
Назовем его "Дополнительные поля":
// активация функции мета блока (my_extra_fields)
add_action( 'add_meta_boxes', 'my_extra_fields_meta_box', 1 );
function my_extra_fields_meta_box() {
$post_type = 'post';
add_meta_box( 'extra_fields', 'Дополнительные поля', 'extra_fields_box_func', $post_type, 'normal', 'high' );
}
2. Заполнение блока HTML-формами
Создайте функцию обратного вызова extra_fields_box_func
, имя которой мы указали в параметре add_meta_box()
. Эта функция отвечает за содержание мета-блока:
// код блока
function extra_fields_box_func( $post ) {
?>
Заголовок страницы (title):
Описание статьи (description):
Видимость поста: ID, 'robotmeta', true ) ?>
Выберите значение:
}
Я сгруппировал все имена полей в массив extra[]
, чтобы было проще обрабатывать эти данные позже.
Скрытое поле name="extra_fields_nonce"
необходимо для защиты данных при их сохранении.
3. Сохранение данных
Теперь нам нужно обработать данные при сохранении поста. Для этого используем хук save_post
, который срабатывает, когда пост сохраняется. В этот момент мы получим данные из массива extra[]
и обработаем их:
// обновление полей при сохранении
add_action( 'save_post', 'my_extra_fields_save_on_update', 0 );
function my_extra_fields_save_on_update( $post_id ) {
// базовая проверка
if(
empty( $_POST['extra'] )
|| ! wp_verify_nonce( $_POST['extra_fields_nonce'], 'extra_fields_nonce_id' )
|| wp_is_post_autosave( $post_id ) || wp_is_post_revision( $post_id )
){
return false;
}
$extra = $_POST['extra'];
// Все в порядке! Теперь нужно сохранить/удалить данные
// Очистка всех данных
$extra = array_map( 'sanitize_text_field', $extra );
foreach( $extra as $key => $value ){
// удалить поле, если значение пустое
if( ! $value ){
delete_post_meta( $post_id, $key );
}
else {
update_post_meta( $post_id, $key, $value ); // add_post_meta() работает автоматически
}
}
return $post_id;
}
Вот и всё! Блок настраиваемых полей готов!
Блок настраиваемых полей для пользовательского типа записи
Если вам нужно создать блок для другого типа записи, например, для "страницы", то нужно зарегистрировать другой мета-блок и описать его HTML-код в новой функции, которую также необходимо указать при регистрации блока (extra_fields_box_page_func
).
Не нужно создавать функцию для обработки полей при сохранении поста, главное — указать имена полей как массивы extra[]
:
function my_extra_fields() {
add_meta_box( 'extra_fields', 'Дополнительные поля', 'extra_fields_box_func', 'post', 'normal', 'high' );
add_meta_box( 'extra_fields', 'Дополнительные поля', 'extra_fields_box_page_func', 'page', 'normal', 'high' );
}
// HTML-код блока для типа записи страница
function extra_fields_box_page_func() {
?>
<?php
}
Проблема с типом "Checkbox"
Недостаток данного метода в том, что массив extra[]
должен быть определён, даже если передаётся пустое значение, иначе поле не будет обработано при сохранении данных.
Это приводит к проблеме при использовании типа "checkbox": <input type="checkbox">
, так как чекбокс передаёт данные только если он отмечен, и не передаёт ничего, если он не отмечен. Однако, нам нужно, чтобы он передавал пустое значение, чтобы код удалял значение, если оно было сохранено ранее.
Чтобы обойти эту "проблему", я сделал следующее: перед полем чекбокса создал скрытое поле с таким же атрибутом имени и пустым значением. В результате, если чекбокс отмечен, значение скрытого поля будет перезаписано, а если чекбокс не отмечен, будет взято пустое значение скрытого поля.
Таким образом, нужно вызывать чекбокс следующим образом:
Такой же трюк может быть полезен и для поля с типом "radio".
Создание метабо��са с помощью класса PHP
В этом примере показано, как создать одно поле для хранения массива данных. Массив можно расширять или уменьшать с помощью кнопки "+" или удалять (это работает с помощью скрипта).
Это пример создания поля "повторитель", похожего на плагин ACF (повторитель в платной версии).
В результате мы получим такой метабокс:
<?php
$my_metabox = new My_Best_Metaboxes( 'post' );
$my_metabox->init();
class My_Best_Metaboxes {
public $post_type;
static $meta_prefix = 'company_address';
public function __construct( $post_type ) {
$this->post_type = $post_type;
}
public function init() {
add_action( 'add_meta_boxes', [ $this, 'add_metabox' ] );
add_action( 'save_post_' . $this->post_type, [ $this, 'save_metabox' ] );
add_action( 'admin_print_footer_scripts', [ $this, 'show_assets' ], 10, 999 );
}
// Добавляет метаблоки
public function add_metabox() {
add_meta_box( 'box_info_company', 'Информация о компании', [
$this,
'render_metabox',
], $this->post_type, 'advanced', 'high' );
}
// Отображает метабокс на странице редактирования поста
public function render_metabox( $post ) {
?>
Адреса компании
';
$addresses = get_post_meta( $post->ID, self::$meta_prefix, true );
if( is_array( $addresses ) ){
foreach( $addresses as $addr ){
printf( $input, esc_attr( $addr ) );
}
}
else{
printf( $input, '' );
}
?>
id == $this->post_type ){
$this->show_styles();
$this->show_scripts();
}
}
// Выводит на экран стили
public function show_styles() {
?>
}
Плагины для создания блоков настраиваемых полей
- Advanced Custom Fields (ACF) — самый популярный и гибкий плагин для создания настраиваемых полей. У него хорошая документация.
- Custom Field Suite — похож на ACF, но менее сложный.
- CMB2 — инструмент для разработчиков, позволяющий создавать метаблоки и мета-поля. Упрощает управление записями, таксономиями, пользователями и комментариями.
- Custom Field Template — универсальный плагин, с помощью которого можно создать любую форму для любых типов записей.
Заключение
Простота настройки блока настраиваемых полей с использованием этого метода неоспорима! Я вовсе не хочу утверждать, что создание блоков таким образом лучше, чем с помощью плагинов. Тем не менее, этот подход более гибкий, потому что позволяет создавать любые поля и настраивать их внешний вид.
Кроме того, часто нет необходимости создавать несколько таких блоков и часто редактировать их, как это делается с помощью плагинов. Например, на этом сайте я использую этот подход, и небольшой код в functions.php
освобождает меня от необходимости использовать дополнительные плагины.
Эта статья больше носит образовательный характер, и для многих плагины будут более подходящим решением.