Метаполе хранит данные, которых нет в стандартных полях записи: цену, дату, статус, характеристики или внутреннюю заметку. Чтобы редактор мог заполнять их в админке, а шаблон сайта — выводить на странице, нужно добавить поле, сохранить его значение в метаданных записи и получить его при выводе.
Для одного-двух полей подойдёт собственный метабокс — отдельный блок в редакторе записи. Ниже показан пример текстового поля для записей и страниц. Код можно разместить в небольшом собственном плагине; если добавить его в файл темы, при смене темы функциональность пропадёт.
Когда достаточно встроенных пользовательских полей
В редакторе WordPress есть панель «Пользовательские поля», где можно вручную создать пару «имя — значение». В блочном редакторе откройте меню с тремя точками, перейдите в «Настройки» → «Параметры» и включите панель пользовательских полей. В зависимости от версии интерфейс может немного отличаться. Такой вариант удобен для разовых значений, если редактору не нужна отдельная форма.
Для регулярной работы лучше добавить метабокс с понятной подписью и заранее заданным полем. Не придётся каждый раз вводить ключ метаполя вручную, а формат данных будет проще контролировать. В примере ниже используется ключ _wpmake_extra_value. Начальное подчёркивание скрывает его от стандартной панели пользовательских полей WordPress; само значение при этом доступно через API метаданных.
Добавляем поле в админку
Создайте файл плагина, например wp-content/plugins/site-extra-meta/site-extra-meta.php, добавьте в него заголовок плагина и следующий код. После этого активируйте плагин в разделе «Плагины». Если вы уже используете собственный плагин для функций сайта, код можно поместить туда.
<?php
/**
* Plugin Name: Site Extra Meta
* Description: Дополнительное поле для записей и страниц.
*/
add_action( 'add_meta_boxes', 'wpmake_add_extra_meta_box' );
function wpmake_add_extra_meta_box() {
add_meta_box(
'wpmake_extra_meta',
'Дополнительные данные',
'wpmake_render_extra_meta_box',
array( 'post', 'page' ),
'normal',
'default'
);
}
function wpmake_render_extra_meta_box( $post ) {
$value = get_post_meta( $post->ID, '_wpmake_extra_value', true );
wp_nonce_field( 'wpmake_save_extra_meta', 'wpmake_extra_meta_nonce' );
?>
<p>
<label for='wpmake_extra_value'>Дополнительное значение</label>
<input
type='text'
id='wpmake_extra_value'
name='wpmake_extra_value'
value='<?php echo esc_attr( $value ); ?>'
class='widefat'
>
</p>
<?php
}
add_action( 'save_post', 'wpmake_save_extra_meta', 10, 3 );
function wpmake_save_extra_meta( $post_id, $post, $update ) {
if ( ! isset( $_POST['wpmake_extra_meta_nonce'] ) ) {
return;
}
if ( ! wp_verify_nonce(
wp_unslash( $_POST['wpmake_extra_meta_nonce'] ),
'wpmake_save_extra_meta'
) ) {
return;
}
if ( wp_is_post_autosave( $post_id ) || wp_is_post_revision( $post_id ) ) {
return;
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
if ( ! isset( $_POST['wpmake_extra_value'] ) ) {
return;
}
$value = sanitize_text_field( wp_unslash( $_POST['wpmake_extra_value'] ) );
if ( '' === $value ) {
delete_post_meta( $post_id, '_wpmake_extra_value' );
return;
}
update_post_meta( $post_id, '_wpmake_extra_value', $value );
}Функция add_meta_box() добавляет блок в редакторы записей и страниц. Поле получает текущее значение через get_post_meta(), а nonce и проверка права edit_post защищают сохранение от поддельного запроса и пользователя без нужных прав. Проверки ревизии и автосохранения не дают записать метаданные для служебной копии записи.
Перед сохранением значение проходит через wp_unslash() и sanitize_text_field(). Пустое поле удаляет метаданные, а заполненное записывает их через update_post_meta(). Для многострочной заметки замените текстовое поле на textarea и примените sanitize_textarea_field(); при выводе такое значение также нужно экранировать.
Выводим значение на сайте
Добавьте этот фрагмент в подходящий шаблон темы — например, рядом с содержимым записи в цикле WordPress. В стандартной теме файл может называться single.php или подключаться из другого шаблона; для страниц обычно используется page.php. Если вы редактируете тему, используйте дочернюю тему, чтобы обновление родительской не перезаписало изменения.
<?php
$extra_value = get_post_meta( get_the_ID(), '_wpmake_extra_value', true );
if ( '' !== $extra_value ) {
echo '<p>' . esc_html( $extra_value ) . '</p>';
}
?>Параметр true просит WordPress вернуть одно значение, а не массив. Проверка на пустую строку не выводит пустой абзац. esc_html() экранирует текст при выводе, поэтому введённая в админке разметка не станет исполняемым HTML. Если значение предназначено для атрибута HTML, используйте esc_attr(); способ экранирования выбирают по месту вывода.
Как адаптировать метаполе под цену, дату или статус
Пример рассчитан на обычный текст. Для цены или числа не полагайтесь только на очистку текстовой строки: задайте ожидаемый формат и проверяйте его при сохранении. Для даты заранее определите формат, например YYYY-MM-DD, чтобы значение было одинаковым при вводе и выводе. Для статуса удобнее выпадающий список с заранее заданными вариантами, а не произвольное текстовое поле.
Если добавляете несколько полей, каждому нужны собственные имя поля в форме и ключ метаданных. Ключи лучше снабжать префиксом проекта, чтобы они не пересекались с полями других плагинов. Если значения должны быть доступны через REST API или редактор блоков, настройка сложнее: метаданные регистрируют через register_post_meta() с подходящими типом, правами и параметром show_in_rest. Для обычного метабокса и вывода в PHP-шаблоне это не требуется.
Проверяем сохранение и вывод
Откройте запись или страницу в админке: блок «Дополнительные данные» должен появиться в редакторе. Введите значение, сохраните или обновите материал, затем перезагрузите редактор. Если текст остался в поле, он сохранён. Откройте страницу на сайте и проверьте, что значение выводится в месте, куда добавлен шаблонный код.
Если метабокс есть, но значение не сохраняется, проверьте, активен ли плагин, не менялись ли имена поля и ключа в одном фрагменте, и не блокирует ли сохранение другой плагин. Если сохранение работает, но на сайте пусто, убедитесь, что код находится в шаблоне именно того типа записи и выполняется внутри цикла. Также проверьте, что используете один и тот же ключ _wpmake_extra_value при записи и чтении.