За восемь лет на 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 ₽ в зависимости от объёма и того, что уже есть в теме. Полный список форматов работы и другие услуги смотрите на странице услуг.