По данным страницы плагина на wordpress.org на 7 октября 2026 года, актуальная версия Advanced Custom Fields (ACF) 6.8.10, плагин ведёт WP Engine, а активных установок больше 2 миллионов. ACF добавляет к записям, страницам и своим типам записей нормальные поля: цену, дату, ссылку, картинку. Их заполняют в админке, а тема выводит в шаблоне.
Стандартного редактора хватает для блога. Когда у контента жёсткая структура, поля удобнее: портфолио с датой и ссылкой на проект, карточки объектов недвижимости с ценой, площадью и адресом, лендинги из повторяющихся секций. Если засунуть такие данные в текст записи, редактор будет путать формат, а вёрстка поплывёт. С полями шаблон всегда знает, откуда брать цену и куда её поставить.
Установка: бесплатный ACF и что есть только в PRO
Бесплатная версия ставится из каталога: «Плагины», «Добавить новый», поиск Advanced Custom Fields, «Установить» и «Активировать». Нужен WordPress 6.2 или новее и PHP 7.4 или новее. В бесплатной версии больше 30 типов полей, а ещё прямо из интерфейса ACF можно регистрировать свои типы записей и таксономии, без кода и отдельного плагина.
Часть возможностей есть только в ACF PRO: поле Repeater, Flexible Content, Gallery, Clone, страницы настроек (Options Page) и ACF Blocks для редактора блоков. Это важно, когда планируете структуру: галерею или сборную страницу из секций на бесплатной версии не сделать.
На wordpress.org есть и отдельный плагин Secure Custom Fields от WordPress.org. В его описании сказано, что при установке он отключает Advanced Custom Fields и ACF PRO, потому что у них совпадают имена функций. Ставить их вместе не получится, выбирайте что-то одно.
Группа полей: Field Name латиницей и правила Location
Поля в ACF живут в группах. Возьмём портфолио фотографа: на проект нужны описание, обложка, ссылка и дата завершения. Откройте ACF, Field Groups, Add New, назовите группу, например «Детали проекта», и добавьте поля:
project_title, тип Text;project_cover, тип Image;project_url, тип URL;finish_date, тип Date Picker.
Label можно писать по-русски, его видит редактор. А Field Name держите латиницей в snake_case: именно по нему поле достают в коде. Если потом переименовать Field Name, уже заполненные значения перестанут находиться в шаблоне, так что продумайте имена сразу.
Дальше вкладка Location Rules в настройках группы. Правила решают, на каком экране редактирования появятся поля: тип записи, шаблон страницы, рубрика и так далее. Правила можно объединять через «и» и «или». Например, «Post Type равно Page» и «Page Template равно Sidebar Template» покажут группу только на страницах с этим шаблоном. Без правил поля окажутся не там, где вы их ждёте.
Вывод в шаблоне: get_field и the_field
Пусть у вас свой тип записи project и шаблон single-project.php. get_field() возвращает значение поля, the_field() сразу его выводит. Вторым аргументом можно передать ID записи, тогда значение возьмётся из неё, а не из текущей.
Базовый вывод с проверками и экранированием выглядит так. У поля Image формат возврата задаётся в настройках поля (Return Format): массив, URL или ID. В примере массив:
<?php if ( $title = get_field( 'project_title' ) ) : ?>
<h1><?php echo esc_html( $title ); ?></h1>
<?php endif; ?>
<?php $cover = get_field( 'project_cover' ); ?>
<?php if ( $cover ) : ?>
<img src="<?php echo esc_url( $cover['url'] ); ?>" alt="<?php echo esc_attr( $cover['alt'] ); ?>">
<?php endif; ?>
<?php if ( $url = get_field( 'project_url' ) ) : ?>
<a href="<?php echo esc_url( $url ); ?>">Ссылка на проект</a>
<?php endif; ?>
<?php if ( $date = get_field( 'finish_date' ) ) : ?>
<p>Дата завершения: <?php echo esc_html( $date ); ?></p>
<?php endif; ?>
Всегда проверяйте, что поле заполнено, и экранируйте вывод: esc_html для текста, esc_url для ссылок, esc_attr для атрибутов. Значение поля задаёт редактор, доверять ему вслепую не стоит.
Flexible Content в ACF PRO: страница из секций
Когда редактор должен сам собирать страницу из блоков (текст, картинка, кнопка), пригодится Flexible Content из ACF PRO. В группе создаётся поле, например page_sections, внутри него макеты (layouts) со своими полями: text_block, image_block, cta_button. Редактор добавляет секции в нужном порядке, а шаблон проходит по ним циклом.
<?php if ( have_rows( 'page_sections' ) ) : ?>
<?php while ( have_rows( 'page_sections' ) ) : the_row(); ?>
<?php if ( get_row_layout() === 'text_block' ) : ?>
<div class="text-block"><?php echo wp_kses_post( get_sub_field( 'text' ) ); ?></div>
<?php elseif ( get_row_layout() === 'image_block' ) : ?>
<?php $img = get_sub_field( 'image' ); ?>
<?php if ( $img ) : ?>
<img src="<?php echo esc_url( $img['url'] ); ?>" alt="<?php echo esc_attr( $img['alt'] ); ?>">
<?php endif; ?>
<?php elseif ( get_row_layout() === 'cta_button' ) : ?>
<a class="cta-button" href="<?php echo esc_url( get_sub_field( 'link' ) ); ?>"><?php echo esc_html( get_sub_field( 'button_text' ) ); ?></a>
<?php endif; ?>
<?php endwhile; ?>
<?php endif; ?>
have_rows() и the_row() проходят по секциям, get_row_layout() говорит, какой макет сейчас, а get_sub_field() достаёт поля внутри секции.
Практические советы
- Сначала нарисуйте схему данных, потом создавайте поля. Тридцать полей «на всякий случай» только мешают редактору.
- Field Name не меняйте после того, как в поля уже что-то внесли.
- На тяжёлых страницах не вызывайте одно и то же поле в цикле много раз: сохраните значение в переменную и включите кэш страниц или объектов.
- Если контент живёт в редакторе блоков, посмотрите на ACF Blocks в PRO: блок с полями ACF собирается на PHP.
- Не выводите URL и HTML из полей без экранирования.
В итоге ACF закрывает разрыв между «просто записью» и нормальной структурой данных: поля в админке, предсказуемый вывод в теме, а в PRO ещё Repeater, Gallery и сборные страницы на Flexible Content. Начать проще всего с одной группы на три-четыре поля и одного шаблона, а дальше добавлять типы записей и секции, когда проекту это правда нужно.