Метабоксы — важный инструмент для добавления дополнительных полей и настроек в админ-панель WordPress. В этой статье разберём, как создать динамический метабокс, который подстраивается под тип записи и её состояние, используя хуки WordPress. Такой подход позволяет создавать гибкие и расширяемые решения без повторения кода.
Что такое динамический метабокс и зачем он нужен
Стандартные метабоксы создаются статично — один набор полей для всех записей определённого типа. Динамический метабокс меняет содержимое в зависимости от условий, например, типа записи, её метаданных или ролей пользователей. Это позволяет предоставлять пользователям только релевантные настройки и упрощает интерфейс.
Пример использования: в интернет-магазине для типа записи «товар» показывать дополнительные поля только для определённой категории товаров. Или для постов с определённым статусом отображать уникальные настройки SEO.
Такой подход улучшает UX и снижает вероятность ошибок при заполнении.
Основные хуки для создания метабоксов в WordPress
Для добавления метабоксов в WordPress используется хук add_meta_boxes. Внутри обработчика этого хука вызывается функция add_meta_box(), которая регистрирует метабокс.
Чтобы сделать метабокс динамическим, обычно в обработчике проверяют условия и в зависимости от них добавляют разные поля или полностью разные метабоксы.
Также полезен хук save_post для сохранения данных из метабоксов.
Пример базовой структуры для динамического метабокса
function wpengine_add_dynamic_metabox() {
global $post;
if ($post->post_type === 'product') {
// Добавляем метабокс только для товаров
add_meta_box(
'wpengine_product_info',
'Информация о товаре',
'wpengine_render_product_metabox',
'product',
'normal',
'default'
);
} elseif ($post->post_type === 'post') {
// Добавляем другой метабокс для постов
add_meta_box(
'wpengine_post_seo',
'SEO настройки',
'wpengine_render_post_seo_metabox',
'post',
'side',
'default'
);
}
}
add_action('add_meta_boxes', 'wpengine_add_dynamic_metabox');Создание функций вывода полей метабоксов
В функции вывода (callback) вы можете использовать PHP для динамического формирования контента, включая условия и циклы.
Пример функции вывода для метабокса товаров, где форма меняется в зависимости от категории товара:
function wpengine_render_product_metabox($post) {
$categories = wp_get_post_terms($post->ID, 'product_cat', array('fields' => 'slugs'));
wp_nonce_field('wpengine_save_product_data', 'wpengine_product_nonce');
echo '<label>Артикул товара:</label>';
$sku = get_post_meta($post->ID, '_wpengine_product_sku', true);
echo '<input type="text" name="wpengine_product_sku" value="' . esc_attr($sku) . '" />';
if (in_array('electronics', $categories)) {
$warranty = get_post_meta($post->ID, '_wpengine_warranty_period', true);
echo '<p><label>Гарантийный срок (мес.):</label></p>';
echo '<input type="number" name="wpengine_warranty_period" value="' . esc_attr($warranty) . '" />';
}
}В этом примере, если товар относится к категории 'electronics', добавляется поле для ввода гарантийного срока. Это демонстрирует, как метабокс адаптируется под данные записи.
Сохранение данных из динамического метабокса
Для сохранения данных используйте хук save_post. Важно проверять nonce и права пользователя, чтобы избежать уязвимостей.
function wpengine_save_dynamic_metabox_data($post_id) {
if (!isset($_POST['wpengine_product_nonce']) || !wp_verify_nonce($_POST['wpengine_product_nonce'], 'wpengine_save_product_data')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (!current_user_can('edit_post', $post_id)) {
return;
}
if (isset($_POST['wpengine_product_sku'])) {
update_post_meta($post_id, '_wpengine_product_sku', sanitize_text_field($_POST['wpengine_product_sku']));
}
if (isset($_POST['wpengine_warranty_period'])) {
update_post_meta($post_id, '_wpengine_warranty_period', intval($_POST['wpengine_warranty_period']));
}
}
add_action('save_post', 'wpengine_save_dynamic_metabox_data');Этот код безопасно сохраняет значения полей, если nonce проверен и пользователь имеет права редактировать запись.
Использование плагина Clearfy Pro для улучшения метабоксов
Для оптимизации работы с метабоксами и управления полями можно использовать плагин Clearfy Pro. Он позволяет отключать ненужные метабоксы, улучшать интерфейс и настраивать поля без лишнего кода.
Clearfy Pro полезен, если на сайте много типов записей и метаданных — он помогает централизованно управлять всеми метабоксами и ускорять работу админки.
Советы по расширению динамических метабоксов
- Используйте пользовательские таксономии для более точного определения условий отображения метабокса.
- Добавляйте AJAX-подгрузку полей, чтобы динамически менять содержимое без перезагрузки страницы.
- Для сложных форм используйте библиотеки типа Expert Review для удобного создания интерфейсов с валидацией и визуальными подсказками.
Пример AJAX-подгрузки поля в метабоксе
Добавим динамическое поле, где список значений зависит от выбранного в другом поле значения, без перезагрузки.
function wpengine_enqueue_scripts() {
wp_enqueue_script('wpengine-metabox-ajax', plugins_url('metabox-ajax.js', __FILE__), array('jquery'), null, true);
wp_localize_script('wpengine-metabox-ajax', 'wpengineAjax', array('ajaxurl' => admin_url('admin-ajax.php')));
}
add_action('admin_enqueue_scripts', 'wpengine_enqueue_scripts');
function wpengine_ajax_get_dynamic_options() {
$selected = sanitize_text_field($_POST['selected']);
$options = array();
if ($selected === 'option1') {
$options = array('sub1' => 'Подопция 1', 'sub2' => 'Подопция 2');
} elseif ($selected === 'option2') {
$options = array('sub3' => 'Подопция 3', 'sub4' => 'Подопция 4');
}
wp_send_json_success($options);
}
add_action('wp_ajax_wpengine_get_dynamic_options', 'wpengine_ajax_get_dynamic_options');JS (файл metabox-ajax.js) будет отправлять запрос и обновлять выбор полей без перезагрузки.
Вывод
Динамические метабоксы с использованием хуков в WordPress — мощный инструмент для создания удобного и адаптивного интерфейса админки. Они помогают показывать пользователю только нужные данные и настраивать сайт более гибко.
Применение проверок, nonce, правильное сохранение и возможность расширения через AJAX делают решение стабильным и удобным для дальнейшей поддержки.
Рекомендуется использовать готовые решения и плагины, такие как Clearfy Pro или Expert Review, чтобы ускорить разработку и повысить качество интерфейсов.