Пользовательские поля (custom fields) — это мощный способ расширить функционал стандартных записей WordPress, добавляя к ним уникальные данные. В этой статье разберем, как добавить и сохранить пользовательские поля без использования плагинов, используя только собственный код и стандартные хуки WordPress. Такой подход позволяет держать сайт легким и не зависеть от сторонних расширений.
Что такое пользовательские поля и зачем они нужны
Пользовательские поля — это дополнительная метаинформация для записей, страниц или кастомных типов постов. Они хранятся в таблице wp_postmeta и позволяют сохранять любые данные: от простого текста до сложных структур. Например, можно добавить цену товара, дату события, дополнительный текстовый блок и многое другое.
Использование пользовательских полей упрощает создание уникального контента и позволяет реализовать кастомный функционал без изменения ядра WordPress.
Создание пользовательских полей через функции темы (без плагинов)
Для добавления пользовательских полей нам нужно сделать три шага:
- Добавить метабокс на страницу редактирования записи
- Сохранить введенные данные
- Вывести пользовательские поля на сайте
Добавление метабокса на экран редактирования записи
Метабокс — это блок в админке WordPress, где пользователь вводит данные. Используем хук add_meta_boxes и функцию add_meta_box.
function wparticles_add_custom_meta_box() {
add_meta_box(
'wparticles_custom_fields', // ID метабокса
'Дополнительные поля', // Заголовок
'wparticles_render_meta_box', // Функция вывода
'post', // Тип записи (можно 'page' или свой)
'normal', // Контекст
'default' // Приоритет
);
}
add_action('add_meta_boxes', 'wparticles_add_custom_meta_box');
function wparticles_render_meta_box($post) {
// Безопасность: nonce для проверки
wp_nonce_field('wparticles_save_meta_box', 'wparticles_meta_box_nonce');
// Получаем текущее значение, если оно есть
$value = get_post_meta($post->ID, '_wparticles_custom_text', true);
echo '<label for="wparticles_custom_text">Текстовое поле:</label>';
echo '<input type="text" id="wparticles_custom_text" name="wparticles_custom_text" value="' . esc_attr($value) . '" size="25" />';
}
Этот код добавит метабокс с текстовым полем на экран редактирования записи.
Сохранение пользовательских данных
Чтобы сохранить введённое значение, нужно использовать хук save_post. Обязательно проверяем nonce и права пользователя.
function wparticles_save_meta_box_data($post_id) {
// Проверяем nonce
if (!isset($_POST['wparticles_meta_box_nonce']) || !wp_verify_nonce($_POST['wparticles_meta_box_nonce'], 'wparticles_save_meta_box')) {
return;
}
// Проверяем права
if (!current_user_can('edit_post', $post_id)) {
return;
}
// Проверяем, что поле есть в запросе
if (!isset($_POST['wparticles_custom_text'])) {
return;
}
$data = sanitize_text_field($_POST['wparticles_custom_text']);
// Сохраняем или обновляем мета-данные
update_post_meta($post_id, '_wparticles_custom_text', $data);
}
add_action('save_post', 'wparticles_save_meta_box_data');
Вывод пользовательских полей на сайте
Чтобы отобразить пользовательские данные в шаблоне, используйте функцию get_post_meta. Например, в файле single.php или в любом шаблонном файле темы:
$custom_text = get_post_meta(get_the_ID(), '_wparticles_custom_text', true);
if (!empty($custom_text)) {
echo '<div class="wparticles-custom-field">' . esc_html($custom_text) . '</div>';
}
Так вы можете выводить любые пользовательские мета-данные, добавленные через свой метабокс.
Расширение: добавление нескольких пользовательских полей
Чтобы добавить несколько полей, просто расширьте форму в функции wparticles_render_meta_box и сохранение в wparticles_save_meta_box_data. Например, добавим поле выбора даты и чекбокс:
function wparticles_render_meta_box($post) {
wp_nonce_field('wparticles_save_meta_box', 'wparticles_meta_box_nonce');
$text = get_post_meta($post->ID, '_wparticles_custom_text', true);
$date = get_post_meta($post->ID, '_wparticles_custom_date', true);
$checkbox = get_post_meta($post->ID, '_wparticles_custom_checkbox', true);
echo '<p><label for="wparticles_custom_text">Текст:</label><br>';
echo '<input type="text" id="wparticles_custom_text" name="wparticles_custom_text" value="' . esc_attr($text) . '" size="25" /></p>';
echo '<p><label for="wparticles_custom_date">Дата:</label><br>';
echo '<input type="date" id="wparticles_custom_date" name="wparticles_custom_date" value="' . esc_attr($date) . '" /></p>';
echo '<p><label><input type="checkbox" name="wparticles_custom_checkbox" value="1" ' . checked($checkbox, '1', false) . ' /> Активировать</label></p>';
}
function wparticles_save_meta_box_data($post_id) {
if (!isset($_POST['wparticles_meta_box_nonce']) || !wp_verify_nonce($_POST['wparticles_meta_box_nonce'], 'wparticles_save_meta_box')) {
return;
}
if (!current_user_can('edit_post', $post_id)) {
return;
}
if (isset($_POST['wparticles_custom_text'])) {
update_post_meta($post_id, '_wparticles_custom_text', sanitize_text_field($_POST['wparticles_custom_text']));
}
if (isset($_POST['wparticles_custom_date'])) {
update_post_meta($post_id, '_wparticles_custom_date', sanitize_text_field($_POST['wparticles_custom_date']));
}
$checkbox_value = isset($_POST['wparticles_custom_checkbox']) ? '1' : '0';
update_post_meta($post_id, '_wparticles_custom_checkbox', $checkbox_value);
}
Теперь на странице записи будет три поля, которые сохраняются и могут быть выведены в шаблоне.
Примеры полезных плагинов для работы с пользовательскими полями
Хотя в статье мы говорим о решении без плагинов, иногда удобно использовать готовые инструменты, например:
- Clearfy Pro — плагин для оптимизации и управления мета-данными.
- Expert Review — расширяет возможности пользовательских полей для отзывов и оценок.
Если вы хотите гибко управлять пользовательскими полями с графическим интерфейсом, эти плагины значительно упростят задачу.
Советы по безопасности и оптимизации
При работе с пользовательскими полями обязательно делайте проверку nonce, прав пользователя и санитайзинг данных. Это защитит сайт от XSS и CSRF атак.
Для оптимизации быстродействия не храните большие объемы данных в мета-полях и избегайте избыточных запросов к базе, кешируя часто используемые значения.