Метаполя и ACF в WordPress: свои поля у записей за 20 минут
Через 20 минут у записей WordPress появятся свои поля: цена, оценка и ссылка на магазин. Их заполняют в редакторе, а на сайте они выводятся под текстом через ACF и короткий PHP-код.

Через 20 минут у каждой записи в WordPress появятся три собственных поля: цена, оценка и ссылка на магазин. Вы заполните их в редакторе, а на сайте они выведутся списком под текстом. Понадобятся плагин ACF и около тридцати строк PHP.
Что нужно до начала
- WordPress 6.x и права администратора.
- Плагин Advanced Custom Fields 6.x. Бесплатной версии хватает, ничего из PRO здесь не используется.
- Доступ к файлам дочерней темы: файловый менеджер хостинга, FTP или SSH. Правки в родительской теме пропадут при её обновлении.
- Свежая резервная копия. Опечатка в functions.php может заменить сайт сообщением об ошибке.
Если ставите плагин из каталога WordPress.org, сверьте название. С октября 2024 года там лежит форк Secure Custom Fields, а сам ACF распространяется с advancedcustomfields.com. Интерфейс форка похож, но шаги ниже проверены логикой ACF, так что сверяйте меню на своей версии.
Какие поля создавать
У каждого поля две «подписи»: метка для редактора и имя для кода. Вписывайте так:
| Параметр | Цена | Оценка | Ссылка |
|---|---|---|---|
| Метка (Field Label) | Цена | Оценка | Ссылка на магазин |
| Имя (Field Name) | price | rating | shop_url |
| Тип (Field Type) | Number | Number | URL |
| Минимум и максимум | не задаём | 1 и 5 | не задаём |
Метка нужна человеку, имя нужно коду. Если перепутать их в шаблоне, страница останется пустой, и ни одной ошибки вы не увидите.
Пояснение. Метаполе (post meta) — пара «ключ — значение», привязанная к записи. WordPress хранит такие пары в таблице wp_postmeta; префикс wp_ на вашем сайте может быть другим. Поле с именем price — это строка с ключом price и значением вроде 59990.
Шаги
- Установите и активируйте ACF. «Плагины» → «Добавить новый» → поиск Advanced Custom Fields. Проверка: в боковом меню появился пункт «ACF» (в старых версиях он назывался «Произвольные поля»).
- Создайте группу полей. Раздел ACF → «Группы полей» → «Добавить». Назовите её «Характеристики обзора». Группа — набор полей, которые показываются в редакторе вместе. Проверка: открылась форма группы с пустым списком полей.
- Добавьте три поля по таблице выше. Для «Оценки» задайте минимум 1 и максимум 5: так редактор не введёт 11. Проверка: после сохранения группы в ней три поля, у каждого видны метка и имя.
- Задайте правило расположения. В блоке «Расположение» (Location): «Тип записи» — «равно» — «Запись». Проверка: откройте любую запись, под текстом появился блок «Характеристики обзора».
- Заполните поля в одной записи. Цена 59990, оценка 4, в ссылке адрес магазина. Нажмите «Обновить» и перезагрузите страницу. Проверка: значения на месте, значит они записались в базу.
- Добавьте вывод в шаблон кодом из следующего раздела. Проверка: на странице записи под текстом появился список из трёх пунктов.
Код для шага 6
Вставьте в functions.php дочерней темы. Код написан под WordPress 6.x и ACF 6.x. Он работает и в обычных, и в блочных темах, потому что дописывает блок к тексту записи, а не правит шаблон.
<?php
// Выводим характеристики под текстом записи.
add_filter( 'the_content', 'myblog_append_review_fields' );
function myblog_append_review_fields( $content ) {
// Только страница одной записи и основной цикл.
if ( ! is_singular( 'post' ) || ! in_the_loop() ) {
return $content;
}
// Если ACF отключён, отдаём текст как есть, а не роняем сайт.
if ( ! function_exists( 'get_field' ) ) {
return $content;
}
$price = get_field( 'price' );
$rating = get_field( 'rating' );
$shop = get_field( 'shop_url' );
// У старых записей поля пустые.
if ( ! $price && ! $rating && ! $shop ) {
return $content;
}
$html = '<ul class="review-meta">';
if ( $price ) {
$html .= '<li>Цена: ' . esc_html( number_format_i18n( (float) $price ) ) . ' ₽</li>';
}
if ( $rating ) {
$html .= '<li>Оценка: ' . esc_html( $rating ) . ' из 5</li>';
}
if ( $shop ) {
$html .= '<li><a href="' . esc_url( $shop ) . '" rel="nofollow noopener">Где купить</a></li>';
}
$html .= '</ul>';
return $content . $html;
}
Значения проходят через esc_html и esc_url: редактор вводит их руками, и в выводе они не должны превращаться в разметку.
Как это выглядит без ACF
ACF не прячет данные в свой формат. Значение из примера читается и стандартной функцией: get_post_meta( get_the_ID(), 'price', true ). Рядом ACF создаёт служебный ключ _price со ссылкой на описание поля. Поэтому после отключения плагина значения останутся в базе, перестанет работать только get_field.
Если не получилось
- В редакторе поля есть, на сайте пусто. В
get_fieldуказана метка вместо имени или опечатка. Сверьте написание с колонкой «Имя» в группе полей символ в символ. - Блок полей не появился в записи. Правило расположения не совпало: например, вы открыли страницу, а не запись. Проверьте и то, что группа включена.
- Fatal error: Uncaught Error: Call to undefined function get_field(). Плагин ACF отключён, а в коде нет проверки
function_exists. Активируйте плагин или верните проверку. - There has been a critical error on this website. В русской локализации текст другой. Обычно это опечатка в PHP: откройте
functions.phpпо FTP и откатите последнюю правку. Подробности WordPress обычно присылает на почту администратора.
Что делать дальше
Сначала откройте три-четыре старые записи, где поля не заполнены: список под ними выводиться не должен. Затем посмотрите в документации ACF, как работает Local JSON. Он сохраняет описание группы полей в файл темы, и группу можно переносить между тестовым сайтом и боевым без ручного повторения шагов. Поля в REST API и блочных привязках — отдельная тема, здесь мы её не разворачиваем.
Редактор изображений: Убрать лишнее, заменить фон, добавить объект, расширить кадр — на вашем изображении.
Спросить за 20 ₽Источники: ACF: документация функции get_field, WordPress Developer Resources: get_post_meta
Частые вопросы
Зачем ACF, если в WordPress есть встроенные произвольные поля?
У меня другая версия WordPress или ACF. Инструкция подойдёт?
Что будет с данными, если отключить или удалить ACF?
Можно ли переименовать имя поля, когда записи уже заполнены?
Я изменил значение поля, а на сайте старое. Что не так?
Что учесть при выкладке на боевой сайт?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.