В WordPress часто возникает необходимость добавлять динамические поля к записям, страницам или пользовательским типам записей. Обычно для этого используют популярный плагин Advanced Custom Fields (ACF), но что делать, если вы хотите обойтись без дополнительных плагинов и реализовать динамические поля самостоятельно? В этой статье мы подробно рассмотрим, как добавить и вывести динамические поля, используя только стандартные возможности WordPress и собственный код.
Что такое динамические поля и зачем они нужны
Динамические поля — это дополнительные метаданные, которые вы можете прикреплять к записям или страницам для хранения уникальной информации. Например, для обзора товара это могут быть характеристики, для события — дата и место проведения. Использование динамических полей позволяет гибко расширять функционал сайта без изменения структуры базы данных.
Вместо того чтобы создавать отдельные таблицы, WordPress предлагает систему метаполей (post meta), которая отлично подходит для хранения дополнительных данных.
Почему не всегда стоит использовать ACF
- Плагин увеличивает нагрузку на сайт.
- Ограниченная кастомизация интерфейса без углублённой настройки.
- Не всегда удобно переносить данные между сайтами без установки самого плагина.
Поэтому написание собственного решения может быть полезно для тех, кто хочет полный контроль и лёгкость кода.
Создаем метабоксы для динамических полей
Для ввода данных в админке создадим метабоксы. Это специальные блоки в интерфейсе редактирования записи, где пользователь сможет вводить нужные значения.
Регистрация метабоксов
Добавим следующий код в файл functions.php вашей темы или в отдельный плагин:
function wpstandart_add_custom_meta_box() {
add_meta_box(
'wpstandart_dynamic_fields',
'Дополнительные поля',
'wpstandart_render_meta_box',
'post', // можно заменить на 'page' или кастомный тип записи
'normal',
'default'
);
}
add_action('add_meta_boxes', 'wpstandart_add_custom_meta_box');
function wpstandart_render_meta_box($post) {
// Безопасность
wp_nonce_field('wpstandart_save_meta_box_data', 'wpstandart_meta_box_nonce');
// Получаем сохраненное значение
$dynamic_value = get_post_meta($post->ID, '_wpstandart_dynamic_field', true);
echo '<label for="wpstandart_dynamic_field">Введите значение:</label>';
echo '<input type="text" id="wpstandart_dynamic_field" name="wpstandart_dynamic_field" value="' . esc_attr($dynamic_value) . '" size="25" />';
}
В этом коде создается метабокс с полем ввода для записи типа post. Вы можете изменить тип записи, передаваемый в add_meta_box, чтобы добавить поля на страницы или кастомные типы.
Сохранение данных метаполя
Чтобы введенные данные сохранялись, добавим функцию обработки сохранения:
function wpstandart_save_meta_box_data($post_id) {
// Проверка nonce
if (!isset($_POST['wpstandart_meta_box_nonce']) ||
!wp_verify_nonce($_POST['wpstandart_meta_box_nonce'], 'wpstandart_save_meta_box_data')) {
return;
}
// Проверка автосохранения
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
// Проверка прав пользователя
if (!current_user_can('edit_post', $post_id)) {
return;
}
if (!isset($_POST['wpstandart_dynamic_field'])) {
return;
}
$new_value = sanitize_text_field($_POST['wpstandart_dynamic_field']);
update_post_meta($post_id, '_wpstandart_dynamic_field', $new_value);
}
add_action('save_post', 'wpstandart_save_meta_box_data');
Этот код проверяет безопасность, права пользователя и сохраняет очищенное значение в базу данных.
Вывод динамических полей на сайте
Теперь, когда данные сохраняются, нужно вывести их в шаблоне сайта. Для этого в файле шаблона (например, single.php) используйте следующий код:
$dynamic_field = get_post_meta(get_the_ID(), '_wpstandart_dynamic_field', true);
if (!empty($dynamic_field)) {
echo '<div class="wpstandart-dynamic-field">Дополнительное поле: ' . esc_html($dynamic_field) . '</div>';
}
Рекомендуется оборачивать вывод в проверку на пустоту, чтобы избежать вывода лишних блоков.
Добавление нескольких динамических полей
Если нужно добавить сразу несколько динамических полей, можно расширить метабокс, добавив дополнительные поля:
function wpstandart_render_meta_box($post) {
wp_nonce_field('wpstandart_save_meta_box_data', 'wpstandart_meta_box_nonce');
$field1 = get_post_meta($post->ID, '_wpstandart_field1', true);
$field2 = get_post_meta($post->ID, '_wpstandart_field2', true);
echo '<p><label for="wpstandart_field1">Поле 1:</label><br />';
echo '<input type="text" id="wpstandart_field1" name="wpstandart_field1" value="' . esc_attr($field1) . '" /></p>';
echo '<p><label for="wpstandart_field2">Поле 2:</label><br />';
echo '<input type="text" id="wpstandart_field2" name="wpstandart_field2" value="' . esc_attr($field2) . '" /></p>';
}
function wpstandart_save_meta_box_data($post_id) {
if (!isset($_POST['wpstandart_meta_box_nonce']) || !wp_verify_nonce($_POST['wpstandart_meta_box_nonce'], 'wpstandart_save_meta_box_data')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (!current_user_can('edit_post', $post_id)) {
return;
}
if (isset($_POST['wpstandart_field1'])) {
update_post_meta($post_id, '_wpstandart_field1', sanitize_text_field($_POST['wpstandart_field1']));
}
if (isset($_POST['wpstandart_field2'])) {
update_post_meta($post_id, '_wpstandart_field2', sanitize_text_field($_POST['wpstandart_field2']));
}
}
add_action('save_post', 'wpstandart_save_meta_box_data');
Таким образом можно создавать любое количество полей, адаптируя интерфейс под нужды проекта.
Использование JSON для сложных динамических данных
Когда необходимо сохранять сложные структуры данных (например, массивы или объекты), рекомендуется использовать JSON для сериализации и десериализации.
Пример сохранения массива:
$data = [
'color' => 'red',
'size' => 'L',
'price' => 1200
];
update_post_meta($post_id, '_wpstandart_complex_field', wp_json_encode($data));
Для вывода:
$json = get_post_meta(get_the_ID(), '_wpstandart_complex_field', true);
$data = json_decode($json, true);
if ($data) {
echo '<ul>';
foreach ($data as $key => $value) {
echo '<li>' . esc_html($key) . ': ' . esc_html($value) . '</li>';
}
echo '</ul>';
}
Это позволяет хранить и отображать сложные динамические данные без использования сторонних плагинов.
Плагины для упрощения работы с динамическими полями
Если хотите облегчить работу, но не использовать ACF, обратите внимание на плагины с минималистичным функционалом:
- Meta Box — мощный и гибкий, но не такой тяжеловесный, как ACF.
- Clearfy Pro — помогает оптимизировать сайт и управлять метаполями, среди множества других функций.
Использование таких инструментов может сэкономить время, если вы не хотите писать код с нуля.
Итоги и рекомендации
Добавление динамических полей в WordPress без плагина ACF — вполне выполнимая и полезная задача для разработчиков, желающих иметь полный контроль. Создание собственного метабокса и сохранение значений через стандартные хуки WordPress даёт максимальную гибкость и не нагружает систему лишними плагинами.
Однако, если проект большой и требует сложных интерфейсов, использование готовых решений типа ACF или Meta Box будет более рациональным.
Экспериментируйте с кодом, адаптируйте его под свои нужды и не забывайте про безопасность и удобство для конечного пользователя.