Advanced Custom Fields: шаблоны страниц и гибкие макеты в WordPress

По данным страницы плагина на 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. Начать проще всего с одной группы на три-четыре поля и одного шаблона, а дальше добавлять типы записей и секции, когда проекту это правда нужно.

Источники и ссылки


Комментарии загружаются…