Кастомные метабоксы в 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 позволяют быстро реализовать нужный функционал без лишних сложностей. Используйте примеры из этой статьи как отправную точку, а затем расширяйте их под свои задачи.