WordPress · 6 мин чтения

Кастомные поля ACF на WordPress: когда без них не обойтись проекту

За восемь лет на WordPress я подключал кастомные поля ACF на WordPress под проект в самых разных ситуациях: от лендинга с блоком «наши кейсы» до каталога на 1200 товаров с фильтрами по десятку параметров. Стандартных полей записи - заголовка, содержимого, миниатюры - хватает для блога на пять рубрик. Как только в ТЗ появляется «у товара должна быть гарантия, артикул, три фото упаковки и видео с YouTube» - без кастомных полей верстка превращается в хардкод внутри темы, который потом страшно трогать.

Когда кастомные поля ACF на WordPress реально нужны под проект

Без ACF я обхожусь на визитках и простых блогах - там достаточно стандартного редактора и пары виджетов. Но как только на проекте появляется кастомный тип записи (портфолио, вакансии, объекты недвижимости, тарифы), без структурированных полей контент-менеджер начинает вписывать всё подряд в тело записи через жирный текст и переносы строк. Через полгода такой контент невозможно вывести в виде таблицы или карточки без ручной правки каждой записи.

На практике кастомные поля закрывают три типа задач:

  • Структура вместо текста - цена, срок доставки, артикул, координаты на карте нужно хранить отдельно от текста, чтобы выводить их в шаблоне в нужном месте и формате.
  • Интеграции с внешними сервисами - при подключении эквайринга Т‑Банка к WooCommerce я храню ID терминала и настройки фискализации в поле на уровне сайта, а не в коде плагина, чтобы клиент менял их сам без моего участия.
  • Гибкий контент для лендингов - на посадочных страницах с блоками «преимущества», «этапы работы», «отзывы» я использую flexible content, чтобы менеджер мог добавлять и переставлять блоки без доступа к коду.

Отдельный кейс - доставка. На проекте с интернет-магазином мебели я выводил доступность по регионам через СДЭК: репитер-поле со списком складов, где для каждого хранится код города СДЭК и остаток на складе. Без ACF пришлось бы городить отдельную таблицу в базе и админку под неё - а тут готовая структура за час настройки.

ACF Free и ACF Pro: какую версию ставить на проект

Besplatная версия закрывает 70% задач: текстовые поля, изображения, чекбоксы, связи между записями. Pro нужен, когда в проекте есть повторяющиеся блоки или страницы настроек.

Возможность ACF Free ACF Pro
Базовые типы полей (текст, число, картинка, select) есть есть
Repeater (повторяющиеся группы полей) нет есть
Flexible Content (конструктор блоков) нет есть
Gallery field нет есть
Options Pages (глобальные настройки сайта) нет есть
ACF Blocks для Gutenberg нет есть
Clone field нет есть

Pro стоит от 49 долларов в год за один сайт по лицензии разработчика - сумма условная в пересчёте на рубли зависит от курса, но для коммерческого проекта с каталогом или конструктором блоков это не обсуждается, экономия на бесплатной версии выйдет боком через месяц разработки костылей.

Типы полей ACF и практические кейсы использования

Repeater я беру для команды на странице «О нас», FAQ-блоков и списка комплектаций товара. Flexible Content - для страниц, которые собираются из модулей: на одном лендинге клиент за год добавил четыре новых блока сам, не обращаясь ко мне.

Post Object и Relationship использую, чтобы связать статью блога с товаром или мастер-класс с преподавателем - это быстрее, чем городить таксономии там, где нужна связь один-к-одному или несколько-ко-многим с ручным порядком.

Options Page - отдельная страница в админке для настроек, которые не привязаны к конкретной записи: телефон в шапке, ссылки на соцсети, API-ключи для форм. Это ровно то место, где стоит держать токены для интеграций с n8n или Telegram-ботом на aiogram, если сайт дергает вебхук при публикации записи - ключ хранится в поле, а не в коде темы, и меняется без деплоя.

Бесплатный материал

🎁 Полезный скрипт в подарок

Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.

Без спама. Отписка в 1 клик.

Как вывести значения ACF в шаблон темы: примеры кода

Простое поле выводится одной строкой:

<?php echo esc_html( get_field( 'warranty_months' ) ); ?> месяцев гарантии

Репитер требует цикла через have_rows/the_row - это конструкция, к которой быстро привыкаешь:

<?php if ( have_rows( 'warehouse_stock' ) ) : ?>
<ul>
<?php while ( have_rows( 'warehouse_stock' ) ) : the_row(); ?>
<li><?php echo esc_html( get_sub_field( 'city_name' ) ); ?>: <?php echo esc_html( get_sub_field( 'qty' ) ); ?> шт.</li>
<?php endwhile; ?>
</ul>
<?php endif; ?>

Для flexible content я обычно завожу отдельный шаблон-partial на каждый layout и подключаю его через get_template_part внутри цикла - так добавление нового блока не превращается в разрастание одного огромного if/elseif на триста строк.

Если нужен не шаблон темы, а вывод полей в REST API - например, чтобы отдать данные во внешнее приложение или в n8n через webhook, - поля нужно явно зарегистрировать через register_rest_field или включить show_in_rest в настройках группы полей. Без этого get_field вернёт данные только внутри WordPress, а не в JSON-ответе API.

ACF Blocks и Gutenberg: кастомные поля в блочном редакторе

С переходом на блочный редактор я почти перестал использовать shortcode-подход и завожу блоки через acf_register_block_type - контент-менеджер видит превью блока прямо в редакторе, а не абстрактный текст в квадратных скобках.

function register_team_block() {
 acf_register_block_type( array(
 'name' => 'team-member',
 'title' => __( 'Карточка сотрудника' ),
 'render_template' => 'template-parts/block-team-member.php',
 'category' => 'formatting',
 'icon' => 'admin-users',
 'mode' => 'edit',
 ) );
}
add_action( 'acf/init', 'register_team_block' );

За блоком закрепляется своя группа полей через условие location - блок видит только те поля, что относятся к нему. На проекте с корпоративным сайтом это сократило время верстки новых страниц с трёх часов до сорока минут: редактор сам собирает страницу из готовых блоков без моего участия.

Частые ошибки при работе с кастомными полями на WordPress-проекте

Самая частая - не экспортировать группы полей в PHP или Local JSON. Если настройки живут только в базе, при переносе на продакшен или второй сайт клиента приходится настраивать всё заново руками. Экспорт в php-файл через встроенный инструмент ACF занимает пять минут и потом просто копируется вместе с темой.

Вторая - хардкодить название поля прямо в шаблоне вместо константы, из-за чего при переименовании поля в админке всё ломается тихо, без ошибки PHP, просто вывод становится пустым.

Третья - злоупотреблять репитерами там, где хватило бы обычной таксономии. Репитер с полусотней строк на каждой из тысячи записей ощутимо утяжеляет запросы к базе, потому что ACF хранит каждое подполе как отдельную строку в postmeta. Если данные повторяются между записями и не привязаны к порядку - это таксономия, а не репитер.

Четвёртая - не проверять правила location у групп полей. Если группа привязана не к тому типу записи или шаблону, поля либо не появляются в редакторе, либо появляются там, где не нужны, и путают контент-менеджера. Готовые шаблоны для типовых сценариев вывода ACF-полей и других повторяющихся задач WordPress я собираю в библиотеке готовых скриптов - часть кода из примеров выше оттуда.

Корпоративный сайт, каталог, блог

Фронтенд + Бэкенд

от 60 000 ₽

Подробнее →

Частые вопросы

Чем кастомные поля ACF отличаются от произвольных полей WordPress по умолчанию?

Встроенные произвольные поля WordPress - это простой список ключ-значение без типизации и интерфейса: редактор вводит текст в две пустые строки и надеется не ошибиться в названии ключа. ACF добавляет типы полей (число, дата, картинка, связь с записью, репитер), валидацию и условия показа - редактор видит понятную форму, а не сырой список метаданных.

Нужен ли ACF Pro для интернет-магазина на WooCommerce?

Если у товаров есть повторяющиеся характеристики - комплектации, варианты упаковки, галерея по цветам - без repeater и gallery field не обойтись, это функции Pro. Для одиночных полей вроде артикула или гарантии хватит бесплатной версии, но на практике магазины редко ограничиваются одним текстовым полем.

Как перенести настройки ACF-полей на другой сайт или на продакшен?

Экспортирую группу полей через Custom Fields → Tools → Export as PHP и вставляю полученный код в файл темы или отдельный плагин. Так поля создаются программно при активации темы и не зависят от ручной настройки в админке - это то же самое, что делают в связке с Local JSON, только более прозрачно при код-ревью.

Сколько стоит внедрение кастомных полей ACF под проект?

Если поля закладываются в разработку нового сайта на WordPress, я включаю их в базовую стоимость проекта - от 60 000 ₽. Для точечной доработки на готовом сайте - добавить группу полей, настроить вывод в существующий шаблон, подключить их к REST API - оцениваю отдельно после короткой консультации, от 3 000 ₽ в зависимости от объёма и того, что уже есть в теме. Полный список форматов работы и другие услуги смотрите на странице услуг.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Самозанятый Калинкин Н. А. · работаю с физлицами и юрлицами

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно