ACF: Произвольные поля для одной рубрики

1 июня 2020

Сложно представить более полезный для Вордпресс девелоперов плагин, чем Advanced Custom Fields (ACF) — он сильно упростил работу с произвольными полями. Недавно столкнулся с тем, что ACF оказывается не умеет прицепляться к одной конкретной рубрике, а может только сразу ко всем. Показываю, как это исправить.

Кворк 2

Задача простейшая: есть блог с кучей рубрик, среди которых есть рубрика «Новости», например. Нужно сделать так, чтобы произвольные поля были только у этой рубрики. У остальных их быть не должно. К сожалению, в ACF такое правило создать нельзя. Но в ACF есть прекрасный механизм создания кастомных правил, с помощью которого можно создавать новые условия.

Процедура состоит из четырех основных шагов: добавления нового типа правила, допустимых операторов, значений и создания функции сопоставления нового правила с редактором ACF.

1. Новый тип

Можно использовать имеющиеся группы, но мы создадим новую и назовем ее «Terms».

add_filter('acf/location/rule_types', 'acf_location_rules_types', 999);
 
function acf_location_rules_types($choices) {

  // create a new group for the rules called Terms
  // if it does not already exist
  if (!isset($choices['Terms'])) {
    $choices['Terms'] = array();
  }
 
  // create new rule type in the new group
  $choices['Terms']['category_id'] = 'Category Name';

  return $choices;
}

2. Новые операторы

Этот шаг пропускаем — новые операторы нам не нужны, вполне достаточно стандартных.

3. Новые значения

Тут все просто — выводим имеющиеся рубрики.

add_filter('acf/location/rule_values/category_id', 'acf_location_rules_values_category');
function acf_location_rules_values_category($choices) {

  // get terms and build choices
  $taxonomy = 'category';
  $args = array('hide_empty' => false);
  $terms = get_terms($taxonomy, $args);
  if (count($terms)) {
    foreach ($terms as $term) {
      $choices[$term->term_id] = $term->name;
    }
  }
 
return $choices;
}

4. Новое правило

И самое главное — пишем функцию, в которой прописываем новое правило.

add_filter('acf/location/rule_match/category_id', 'acf_location_rules_match_category', 10, 3);
 
function acf_location_rules_match_category($match, $rule, $options) {
  if (!isset($_GET['tag_ID']) ||
    !isset($_GET['taxonomy']) ||
    $_GET['taxonomy'] != 'category') {
      // bail early
      return $match;
    }

    $term_id = $_GET['tag_ID'];
    $selected_term = $rule['value'];
    if ($rule['operator'] == '==') {
      $match = ($selected_term == $term_id);
    } elseif ($rule['operator'] == '!=') {
      $match = ($selected_term != $term_id);
  }

return $match;
}

Код нужно добавить в файл functions.php активной темы или вынести в отдельный плагин.

В результате в условиях отображения ACF должно появиться новое правило.

ACF: Кастомные условия отображения

Задача решена.

По материалам форума поддержки Advanced Custom Fields

Подпишитесь на мой телеграм и первыми получайте новые материалы, в том числе которых нет на сайте.

INNERSTAT
Иван Данилин

Практикующий веб-разработчик, специализируюсь на платформе Вордпресс.

Добавить комментарий