Иван Данилин
Fullstack WordPress Developer
Задача простейшая: есть блог с кучей рубрик, среди которых есть рубрика «Новости», например. Нужно сделать так, чтобы произвольные поля были только у этой рубрики. У остальных их быть не должно. К сожалению, в 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 должно появиться новое правило.
Задача решена.
По материалам форума поддержки Advanced Custom Fields