Как создать кастомный метабокс в WordPress: практическое руководство

Кастомные метабоксы в WordPress — это мощный инструмент для расширения стандартного интерфейса админки. Они позволяют добавить дополнительные поля и настроить удобный ввод данных для ваших записей, страниц и других типов постов. В этой статье мы подробно разберём, как создать свой собственный метабокс, используя чистый PHP, без плагинов, и как сохранить введённые данные корректно и безопасно.

Что такое кастомный метабокс в WordPress и зачем он нужен

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

Пример использования кастомных метабоксов:

  • Добавление дополнительной информации к записи (например, авторские данные, рейтинг, дата события)
  • Добавление настроек отображения для конкретного поста
  • Создание интерфейса для удобного ввода сложных данных, без необходимости руками редактировать шаблоны

Создавая кастомные метабоксы, вы делаете админку более гибкой и удобной для конечных пользователей.

Как добавить кастомный метабокс в WordPress: базовый пример

Для начала создадим простой метабокс с текстовым полем. Добавим следующий код в файл functions.php вашей темы или в собственный плагин:

function wprus_add_custom_metabox() {
    add_meta_box(
        'wprus_custom_metabox_id', // ID метабокса
        'Дополнительная информация', // Заголовок
        'wprus_custom_metabox_callback', // Callback функция вывода содержимого
        'post', // Тип записи, где показывать (post, page или кастомный тип)
        'normal', // Контекст (normal, side, advanced)
        'high' // Приоритет
    );
}
add_action('add_meta_boxes', 'wprus_add_custom_metabox');

function wprus_custom_metabox_callback($post) {
    // Добавляем nonce для верификации
    wp_nonce_field('wprus_custom_metabox_nonce_action', 'wprus_custom_metabox_nonce');
    
    $value = get_post_meta($post->ID, '_wprus_custom_field', true);
    
    echo '<label for="wprus_custom_field">Введите дополнительный текст:</label>';
    echo '<input type="text" id="wprus_custom_field" name="wprus_custom_field" value="' . esc_attr($value) . '" size="25" />';
}

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

function wprus_save_custom_metabox_data($post_id) {
    // Проверяем nonce
    if (!isset($_POST['wprus_custom_metabox_nonce'])) {
        return;
    }
    if (!wp_verify_nonce($_POST['wprus_custom_metabox_nonce'], 'wprus_custom_metabox_nonce_action')) {
        return;
    }
    // Проверяем права пользователя
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }
    // Проверяем, что это не автосохранение
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    
    if (isset($_POST['wprus_custom_field'])) {
        $data = sanitize_text_field($_POST['wprus_custom_field']);
        update_post_meta($post_id, '_wprus_custom_field', $data);
    }
}
add_action('save_post', 'wprus_save_custom_metabox_data');

Расширение метабокса: разные типы полей и группировка

Для удобства пользователей часто нужно добавить не одно, а несколько полей разных типов. Например, текст, textarea, чекбоксы, select и даже загрузку изображений. Вот пример расширенного метабокса с несколькими полями:

function wprus_custom_metabox_callback($post) {
    wp_nonce_field('wprus_custom_metabox_nonce_action', 'wprus_custom_metabox_nonce');
    
    $text = get_post_meta($post->ID, '_wprus_text', true);
    $textarea = get_post_meta($post->ID, '_wprus_textarea', true);
    $checkbox = get_post_meta($post->ID, '_wprus_checkbox', true);
    $select = get_post_meta($post->ID, '_wprus_select', true);
    
    echo '<label for="wprus_text">Текстовое поле:</label>';
    echo '<input type="text" id="wprus_text" name="wprus_text" value="' . esc_attr($text) . '" size="30" /><br/>';
    
    echo '<label for="wprus_textarea">Текстовая область:</label>';
    echo '<textarea id="wprus_textarea" name="wprus_textarea" rows="4" cols="30">' . esc_textarea($textarea) . '</textarea><br/>';
    
    echo '<label><input type="checkbox" name="wprus_checkbox" value="1" ' . checked(1, $checkbox, false) . ' /> Включить опцию</label><br/>';
    
    echo '<label for="wprus_select">Выберите опцию:</label>';
    echo '<select name="wprus_select" id="wprus_select">';
    $options = ['' => 'Не выбрано', 'option1' => 'Опция 1', 'option2' => 'Опция 2'];
    foreach ($options as $key => $label) {
        echo '<option value="' . esc_attr($key) . '" ' . selected($select, $key, false) . '>' . esc_html($label) . '</option>';
    }
    echo '</select>';
}

Обработчик сохранения в этом случае нужно дополнить, чтобы учитывать новые поля:

function wprus_save_custom_metabox_data($post_id) {
    if (!isset($_POST['wprus_custom_metabox_nonce']) || !wp_verify_nonce($_POST['wprus_custom_metabox_nonce'], 'wprus_custom_metabox_nonce_action')) {
        return;
    }
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    
    if (isset($_POST['wprus_text'])) {
        update_post_meta($post_id, '_wprus_text', sanitize_text_field($_POST['wprus_text']));
    }
    if (isset($_POST['wprus_textarea'])) {
        update_post_meta($post_id, '_wprus_textarea', sanitize_textarea_field($_POST['wprus_textarea']));
    }
    $checkbox_value = isset($_POST['wprus_checkbox']) ? 1 : 0;
    update_post_meta($post_id, '_wprus_checkbox', $checkbox_value);
    if (isset($_POST['wprus_select'])) {
        update_post_meta($post_id, '_wprus_select', sanitize_text_field($_POST['wprus_select']));
    }
}

Использование готовых плагинов для создания метабоксов

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

  • Advanced Custom Fields (ACF): самый популярный плагин с удобным интерфейсом, поддержкой разных типов полей и выводом значений через функции.
  • Meta Box: мощный фреймворк для метабоксов с множеством расширений и гибкой архитектурой.
  • CMB2: легковесный и расширяемый плагин с открытым исходным кодом, который позволяет создавать метабоксы и поля различного типа.

Например, с ACF вы можете создать метабокс через админку и получить доступ к данным через функцию get_field('field_name'), что сильно экономит время и снижает вероятность ошибок.

Советы по безопасности и производительности

При работе с кастомными метабоксами важно не забывать о безопасности и оптимизации:

  • Всегда используйте nonce для защиты от CSRF-атак.
  • Проверяйте права пользователя перед сохранением данных.
  • Санитизируйте и валидируйте все полученные данные.
  • Не добавляйте тяжелые операции в обработчики сохранения (например, внешние запросы).
  • Используйте именованные префиксы для своих функций и метаполей, чтобы избежать конфликтов.

Заключение

Создание кастомных метабоксов в WordPress — это отличный способ сделать админку удобнее и функциональнее. Даже базовые знания PHP и WordPress API позволяют быстро реализовать нужный функционал без лишних сложностей. Используйте примеры из этой статьи как отправную точку, а затем расширяйте их под свои задачи.

Как установить и настроить WPGPT в WordPress для автописания контента
21.02.2026
Как изменить вывод WooCommerce на странице товара в WordPress: практические примеры
11.03.2026
Как динамически изменить заголовок страницы в WordPress: практические методы и примеры
24.03.2026
Автоматическое создание категорий при импорте товаров WooCommerce: практическое руководство
15.04.2026
Как установить ограничения на регистрацию в WordPress по домену email
05.02.2026
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше