Добавляем в Advanced Custom Fields фильтр вывода полей у поста «для определнных категорий и подкатегорий» в WordPress

В 90% случаев при разработке на WordPress  спасает компонент Advanced Custom Fields. Это компонент динамического добавления полей для разных компонентов WordPress — постов, страниц, настройки темы (только в PRO) и многое другое. 

Для каждого набора полей есть настройка — где будут выводиться эти поля. Выбор достаточно большой, но при разработке очередного сайта мне не хватило условия — выводить для постов, которые находятся в определенной рубрике (категории) или подрубрике (подкатегории). Стандартный функционал предлагает выбрать только фиксированную рубрику. 

Благо, у компонента ACF есть отличное API, построенное на хуках, чем мы и воспользуемся.

Для начала нам необходимо добавить условия в настройки группы полей, это должно будет выглядеть следующим образом:

shot_161014_100433

В данном случае нам необходимо добавить два хука, первый из которых добавляет новый пункт «Post Parent Category» в группу «Post». Второй хук добавляет значения фильтра, а именно список категорий. Код вывода списка категорий подсмотрен в исходниках ACF плагина, там есть замечательная функция acf_get_taxonomy_terms($taxonomy), которая используется для схожих фильтров. 

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

В данном коде две функции, где одна обрабатывает — выводить ли группу полей на текущей странице, а вторая рекурсивно проходит по цепочке рубрик. 

Ссылки по теме:

https://www.advancedcustomfields.com/resources/custom-location-rules/