Динамические поля в WordPress часто используются для расширения функционала сайта, позволяя хранить и отображать дополнительную информацию для постов, страниц или пользовательских типов записей. Хотя существует множество плагинов, которые упрощают эту задачу, иногда необходимо обойтись без них — чтобы избежать лишней нагрузки или сохранить полный контроль над кодом.
Что такое динамические поля и зачем они нужны в WordPress
Динамические поля — это произвольные поля (custom fields), которые позволяют добавлять к записи или странице уникальные данные, не предусмотренные в стандартном наборе полей WordPress. Например, для сайта с каталогом товаров это может быть цена, артикул, цвет и другие параметры. Для блога — информация об авторе, рейтинг, дата события и многое другое.
Использование динамических полей позволяет сделать сайт более гибким и настраиваемым без необходимости создавать отдельные таблицы в базе данных. WordPress хранит эти данные в таблице wp_postmeta, что упрощает взаимодействие с ними.
В этой статье мы рассмотрим, как самостоятельно добавить динамические поля через код, без использования плагинов, чтобы вы могли максимально адаптировать функционал под свои нужды.
Создание метабоксов для динамических полей в админке WordPress
Регистрация метабокса через хук add_meta_boxes
Для начала нам нужно создать метабокс — область в редакторе записи или страницы, где пользователь сможет вводить значения для динамических полей. Это делается с помощью функции add_meta_box, которую мы подключаем через хук add_meta_boxes.
Ниже пример функции wpfront_add_custom_meta_box, которая добавляет метабокс к записям:
function wpfront_add_custom_meta_box() {
add_meta_box(
'wpfront_dynamic_fields',
'Дополнительные данные',
'wpfront_render_meta_box',
'post',
'normal',
'default'
);
}
add_action('add_meta_boxes', 'wpfront_add_custom_meta_box');Здесь параметры функции:
'wpfront_dynamic_fields'— уникальный ID метабокса;'Дополнительные данные'— заголовок метабокса;'wpfront_render_meta_box'— функция, которая будет выводить HTML метабокса;'post'— тип записи, для которого добавляем метабокс (можно указать 'page' или пользовательский тип);'normal'— расположение метабокса;'default'— приоритет.
Вывод формы для ввода данных
Теперь создадим функцию wpfront_render_meta_box, которая выведет необходимые поля. Для примера добавим два поля: «Цена» и «Артикул».
function wpfront_render_meta_box($post) {
// Добавляем nonce для безопасности
wp_nonce_field('wpfront_save_meta_box_data', 'wpfront_meta_box_nonce');
$price = get_post_meta($post->ID, '_wpfront_price', true);
$sku = get_post_meta($post->ID, '_wpfront_sku', true);
echo '<p><label for="wpfront_price">Цена:</label>';
echo '<input type="text" id="wpfront_price" name="wpfront_price" value="' . esc_attr($price) . '" size="25" /></p>';
echo '<p><label for="wpfront_sku">Артикул:</label>';
echo '<input type="text" id="wpfront_sku" name="wpfront_sku" value="' . esc_attr($sku) . '" size="25" /></p>';
}Так мы получаем два текстовых поля, значения которых сохраняются в метаполях _wpfront_price и _wpfront_sku.
Сохранение данных динамических полей при сохранении записи
Необходимо обработать событие сохранения записи, чтобы сохранить введённые данные в базу. Для этого используем хук save_post и проверяем nonce для безопасности.
function wpfront_save_meta_box_data($post_id) {
// Проверяем nonce
if (!isset($_POST['wpfront_meta_box_nonce']) || !wp_verify_nonce($_POST['wpfront_meta_box_nonce'], 'wpfront_save_meta_box_data')) {
return;
}
// Проверяем права пользователя
if (!current_user_can('edit_post', $post_id)) {
return;
}
// Сохраняем цену
if (isset($_POST['wpfront_price'])) {
$price = sanitize_text_field($_POST['wpfront_price']);
update_post_meta($post_id, '_wpfront_price', $price);
}
// Сохраняем артикул
if (isset($_POST['wpfront_sku'])) {
$sku = sanitize_text_field($_POST['wpfront_sku']);
update_post_meta($post_id, '_wpfront_sku', $sku);
}
}
add_action('save_post', 'wpfront_save_meta_box_data');Таким образом, при сохранении записи введённые данные попадут в метаполя.
Вывод динамических полей на фронтенде сайта
Теперь, когда у нас есть данные, их нужно вывести на странице записи или в шаблоне. Для этого используем функцию get_post_meta.
function wpfront_display_custom_fields() {
global $post;
$price = get_post_meta($post->ID, '_wpfront_price', true);
$sku = get_post_meta($post->ID, '_wpfront_sku', true);
if ($price) {
echo '<p><strong>Цена:</strong> ' . esc_html($price) . '</p>';
}
if ($sku) {
echo '<p><strong>Артикул:</strong> ' . esc_html($sku) . '</p>';
}
}Добавьте вызов wpfront_display_custom_fields() в нужное место ваших шаблонов, например, в single.php для отображения дополнительной информации под содержимым записи.
Расширение: использование динамических полей для пользовательских типов записей
Принцип добавления динамических полей для пользовательских типов записей (Custom Post Types) идентичен. При регистрации метабокса укажите нужный тип записи.
add_meta_box(
'wpfront_dynamic_fields',
'Дополнительные данные',
'wpfront_render_meta_box',
'product', // пользовательский тип записи
'normal',
'default'
);Также можно добавить проверку типа записи внутри функций для более универсального кода. Это позволит использовать одни и те же метабоксы и функции для разных типов записей.
Преимущества использования собственного кода вместо плагинов
Использование собственного кода для создания и управления динамическими полями даёт несколько преимуществ:
- Минимум зависимостей и отсутствие лишних плагинов, что улучшает производительность и безопасность;
- Полный контроль над функциями и возможностью кастомизации под конкретные задачи;
- Отсутствие конфликтов с обновлениями плагинов и тем;
- Легкость интеграции с другими элементами сайта и темами.
Однако стоит помнить, что при добавлении новых полей и сложной логики лучше следить за безопасностью — использовать nonce, проверять права пользователей и корректно обрабатывать данные.
Вывод
Добавление динамических полей в WordPress без плагинов — задача вполне решаемая с помощью базовых хуков и функций CMS. Это позволит создавать гибкие решения, адаптированные под любые требования проекта, и при этом не перегружать сайт лишними расширениями.
Используйте приведённые примеры, адаптируйте их под свои нужды и получайте удобный, понятный и стабильный функционал динамических полей на вашем сайте.