В WordPress метабоксы — это удобный способ расширить функциональность редактора записей, добавив свои поля и настройки. Создание уникального метабокса помогает управлять дополнительными данными и делать интерфейс более удобным для пользователя. В этой статье мы подробно разберём, как создать собственный метабокс, используя WordPress хуки, с примерами кода и рекомендациями.
Что такое метабоксы и зачем создавать уникальные
Метабокс — это блок дополнительной информации, который отображается в админке на странице редактирования записи, страницы или произвольного типа записи. В стандартном редакторе WordPress вы видите метабоксы для категорий, тегов, изображения записи и т.д. Уникальный метабокс можно создавать для хранения специфических данных, например, рейтинга, дополнительного описания, настроек отображения и других параметров.
Преимущества уникальных метабоксов:
- Упрощение ввода и редактирования дополнительных данных
- Повышение удобства для конечного пользователя
- Гибкая интеграция с кастомными типами записей и функционалом сайта
- Возможность использования в шаблонах для вывода данных
Для реализации метабоксов в WordPress используется API add_meta_box, а для сохранения данных — хуки сохранения записи.
Создание метабокса с помощью хуков WordPress
Для добавления метабокса используют хук add_meta_boxes. В функции-обработчике регистрируем метабокс с уникальным ID, заголовком и функцией отображения.
Пример кода для сайта wpsetup:
function wpsetup_add_custom_metabox() {
add_meta_box(
'wpsetup_custom_metabox', // ID метабокса
'Дополнительные настройки', // Заголовок
'wpsetup_custom_metabox_callback', // Функция отображения
['post', 'page'], // Типы записей
'normal', // Контекст (normal, side, advanced)
'default' // Приоритет
);
}
add_action('add_meta_boxes', 'wpsetup_add_custom_metabox');Функция wpsetup_custom_metabox_callback выводит HTML с полями метабокса:
function wpsetup_custom_metabox_callback($post) {
// Используем nonce для проверки безопасности
wp_nonce_field('wpsetup_metabox_nonce_action', 'wpsetup_metabox_nonce');
$value = get_post_meta($post->ID, '_wpsetup_custom_field', true);
echo '<label for="wpsetup_custom_field">Введите значение:</label> ';
echo '<input type="text" id="wpsetup_custom_field" name="wpsetup_custom_field" value="' . esc_attr($value) . '" size="25" />';
}Что делает код
Мы добавили метабокс для постов и страниц с одним текстовым полем. Для безопасности создаём nonce. Значение поля извлекается из метаданных поста и выводится в форме.
Сохранение данных метабокса с проверками
Для сохранения введённых данных используем хук save_post. В функции нужно проверить nonce, права пользователя и избежать автосохранения.
function wpsetup_save_custom_metabox_data($post_id) {
// Проверяем nonce
if (!isset($_POST['wpsetup_metabox_nonce']) || !wp_verify_nonce($_POST['wpsetup_metabox_nonce'], 'wpsetup_metabox_nonce_action')) {
return;
}
// Проверяем права
if (!current_user_can('edit_post', $post_id)) {
return;
}
// Проверяем, что это не автосохранение
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['wpsetup_custom_field'])) {
$sanitized = sanitize_text_field($_POST['wpsetup_custom_field']);
update_post_meta($post_id, '_wpsetup_custom_field', $sanitized);
}
}
add_action('save_post', 'wpsetup_save_custom_metabox_data');Таким образом, мы надёжно сохраняем данные, предотвращая возможные атаки и ошибки.
Расширение метабокса: добавление нескольких полей и групп
Чтобы метабокс был более полезным, можно добавить несколько полей разных типов. Например, текст, чекбокс, селект и textarea.
Пример расширенного метабокса:
function wpsetup_custom_metabox_callback($post) {
wp_nonce_field('wpsetup_metabox_nonce_action', 'wpsetup_metabox_nonce');
$text = get_post_meta($post->ID, '_wpsetup_text', true);
$checkbox = get_post_meta($post->ID, '_wpsetup_checkbox', true);
$select = get_post_meta($post->ID, '_wpsetup_select', true);
$textarea = get_post_meta($post->ID, '_wpsetup_textarea', true);
echo '<p><label for="wpsetup_text">Текстовое поле:</label><br/>';
echo '<input type="text" id="wpsetup_text" name="wpsetup_text" value="' . esc_attr($text) . '" size="30" /></p>';
echo '<p><label><input type="checkbox" name="wpsetup_checkbox" value="1" ' . checked(1, $checkbox, false) . ' /> Включить опцию</label></p>';
echo '<p><label for="wpsetup_select">Выберите вариант:</label><br/>';
echo '<select name="wpsetup_select" id="wpsetup_select">';
$options = ['option1' => 'Вариант 1', 'option2' => 'Вариант 2', 'option3' => 'Вариант 3'];
foreach ($options as $key => $label) {
echo '<option value="' . esc_attr($key) . '" ' . selected($select, $key, false) . '>' . esc_html($label) . '</option>';
}
echo '</select></p>';
echo '<p><label for="wpsetup_textarea">Большое текстовое поле:</label><br/>';
echo '<textarea id="wpsetup_textarea" name="wpsetup_textarea" rows="4" cols="30">' . esc_textarea($textarea) . '</textarea></p>';
}Для сохранения добавьте соответствующие проверки и сохранение каждого поля в функции сохранения.
Использование плагинов для создания метабоксов
Если не хотите писать код, можно использовать плагины для метабоксов. Рекомендуем обратить внимание на Clearfy — многофункциональный плагин с инструментами для оптимизации и кастомизации, включая дополнительные метабоксы и улучшения админки.
Также популярны:
- Meta Box — мощный фреймворк для создания метабоксов и пользовательских полей
- Advanced Custom Fields (ACF) — удобный визуальный конструктор полей
Но собственный код даёт максимальный контроль и лёгкость, особенно для нестандартных задач.
Заключение: советы и лучшие практики
Создание уникального метабокса в WordPress — важный навык для разработчика, позволяющий расширять функционал сайта и делать интерфейс удобнее.
Рекомендации:
- Всегда проверяйте nonce и права пользователя при сохранении
- Используйте функции санитизации для защиты данных
- Добавляйте метабоксы только к нужным типам записей
- Делайте поля понятными и удобными для пользователя
- Тестируйте на разных версиях WordPress и с другими плагинами
Если хотите глубже изучить, можно посмотреть документацию WordPress по Custom Meta Boxes.
Таким образом, используя хук add_meta_boxes для добавления и save_post для сохранения, вы можете создавать любые уникальные метабоксы под задачи вашего сайта.