Произвольные поля (custom fields) — это мощный инструмент WordPress, позволяющий добавлять дополнительную информацию к записям, страницам и другим типам контента. В этой статье мы разберём, как создавать, сохранять и отображать произвольные поля без использования плагинов, что позволит вам лучше контролировать функциональность и избежать лишних зависимостей.
Что такое произвольные поля в WordPress и зачем они нужны
Произвольные поля — это способ добавить к посту любую дополнительную информацию в виде пар «ключ — значение». Например, к статье можно добавить цену товара, дату события или автора обзора. Обычно для работы с произвольными полями используют плагины, но зачастую это излишне, если вам нужна простая кастомизация.
Использование произвольных полей позволяет расширять функциональность сайта без создания новых типов записей или таксономий. Это особенно полезно для небольших проектов или когда вы хотите быстро добавить новые данные к существующим материалам.
Кроме того, работа с произвольными полями вручную даёт полный контроль над тем, как данные сохраняются и выводятся, что улучшает производительность и безопасность.
Создание метабокса для произвольных полей в админ-панели
Чтобы добавить удобный интерфейс для ввода произвольных полей, создадим собственный метабокс. Для этого добавим в файл functions.php вашей темы или в отдельный плагин следующий код:
function wpmart_add_custom_meta_box() {
add_meta_box(
'wpmart_custom_fields',
'Дополнительные поля',
'wpmart_custom_meta_box_callback',
'post',
'normal',
'high'
);
}
add_action('add_meta_boxes', 'wpmart_add_custom_meta_box');
function wpmart_custom_meta_box_callback($post) {
wp_nonce_field('wpmart_save_custom_fields', 'wpmart_custom_fields_nonce');
$value = get_post_meta($post->ID, '_wpmart_custom_field', true);
echo '<label for="wpmart_custom_field">Произвольное поле:</label>';
echo '<input type="text" id="wpmart_custom_field" name="wpmart_custom_field" value="' . esc_attr($value) . '" size="25" />';
}Этот код создаёт метабокс «Дополнительные поля» на странице редактирования записей, где можно ввести значение произвольного поля.
Объяснение кода метабокса
Функция wpmart_add_custom_meta_box регистрирует метабокс для типа записи post. В колбеке wpmart_custom_meta_box_callback мы выводим поле ввода и nonce для безопасности.
Используем функцию get_post_meta, чтобы получить текущее значение поля, если оно уже задано, и вывести его в инпут, чтобы пользователь мог отредактировать.
Сохранение данных произвольных полей при сохранении записи
Чтобы введённые данные не потерялись, нужно обработать их при сохранении записи. Добавим обработчик:
function wpmart_save_custom_fields($post_id) {
if (!isset($_POST['wpmart_custom_fields_nonce'])) {
return;
}
if (!wp_verify_nonce($_POST['wpmart_custom_fields_nonce'], 'wpmart_save_custom_fields')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (!current_user_can('edit_post', $post_id)) {
return;
}
if (isset($_POST['wpmart_custom_field'])) {
$my_data = sanitize_text_field($_POST['wpmart_custom_field']);
update_post_meta($post_id, '_wpmart_custom_field', $my_data);
}
}
add_action('save_post', 'wpmart_save_custom_fields');Здесь мы проверяем nonce, права пользователя и избегаем автосохранения, чтобы не перезаписать данные случайно. Значение поля очищается функцией sanitize_text_field для безопасности.
Вывод произвольных полей на сайте в шаблоне темы
Чтобы вывести произвольное поле в шаблоне, например, в single.php, используйте следующий код:
function wpmart_display_custom_field() {
global $post;
$value = get_post_meta($post->ID, '_wpmart_custom_field', true);
if (!empty($value)) {
echo '<div class="wpmart-custom-field">' . esc_html($value) . '</div>';
}
}Добавьте вызов wpmart_display_custom_field() в нужное место шаблона, чтобы вывести значение. Можно оформить вывод стилями, чтобы визуально выделить произвольное поле.
Пример использования в single.php
В файле single.php после контента записи можно добавить:
<?php
the_content();
wpmart_display_custom_field();
?>Это позволит пользователям видеть дополнительную информацию, которую вы добавили через метабокс.
Альтернативы и расширения: работа с несколькими произвольными полями
Если нужно добавить несколько полей, расширьте метабокс, добавив больше инпутов с разными именами и ключами в post meta. Вот пример расширенного метабокса с двумя полями:
function wpmart_custom_meta_box_callback($post) {
wp_nonce_field('wpmart_save_custom_fields', 'wpmart_custom_fields_nonce');
$field1 = get_post_meta($post->ID, '_wpmart_custom_field1', true);
$field2 = get_post_meta($post->ID, '_wpmart_custom_field2', true);
echo '<p><label for="wpmart_custom_field1">Поле 1:</label>';
echo '<input type="text" id="wpmart_custom_field1" name="wpmart_custom_field1" value="' . esc_attr($field1) . '" size="25" /></p>';
echo '<p><label for="wpmart_custom_field2">Поле 2:</label>';
echo '<input type="text" id="wpmart_custom_field2" name="wpmart_custom_field2" value="' . esc_attr($field2) . '" size="25" /></p>';
}И обработчик сохранения нужно расширить:
function wpmart_save_custom_fields($post_id) {
if (!isset($_POST['wpmart_custom_fields_nonce']) || !wp_verify_nonce($_POST['wpmart_custom_fields_nonce'], 'wpmart_save_custom_fields')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (!current_user_can('edit_post', $post_id)) {
return;
}
if (isset($_POST['wpmart_custom_field1'])) {
update_post_meta($post_id, '_wpmart_custom_field1', sanitize_text_field($_POST['wpmart_custom_field1']));
}
if (isset($_POST['wpmart_custom_field2'])) {
update_post_meta($post_id, '_wpmart_custom_field2', sanitize_text_field($_POST['wpmart_custom_field2']));
}
}
add_action('save_post', 'wpmart_save_custom_fields');Полезные плагины для работы с произвольными полями
Если вы хотите расширить возможности без программирования, можно использовать плагины:
- Advanced Custom Fields (ACF) — самый популярный плагин для создания произвольных полей с удобным интерфейсом.
- Meta Box — мощный и гибкий плагин для создания метабоксов и полей с поддержкой разных типов данных.
- CMB2 — библиотека для разработчиков, позволяющая создавать кастомные поля с минимальными усилиями.
Но если вам нужно лёгкое, быстрое решение без плагинов, описанный выше способ отлично подходит для большинства задач.
Советы по безопасности и производительности при работе с произвольными полями
При добавлении произвольных полей важно:
- Использовать nonce для защиты от CSRF.
- Проверять права пользователя перед сохранением.
- Санитизировать и валидировать данные, чтобы не допустить XSS и инъекций.
- Минимизировать количество запросов к базе данных, кэшируя результаты, если поле часто используется.
Так вы сделаете ваш сайт надёжным и быстрым.
Итог
Добавление произвольных полей без плагинов — это простой и эффективный способ расширить функциональность WordPress. С помощью метабоксов, обработчиков сохранения и правильного вывода вы сможете гибко управлять дополнительными данными на сайте, не перегружая его лишними расширениями.