WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Добавление полей к определенной рубрике

Advanced Custom Fields

В Advanced Custom Fields из коробки нет условия, чтобы отобразить группу полей на странице редактирования определенной рубрики. В этой заметке мы напишем такие правила.

Поясняющее видео

Добавляем условие в выпадающий список

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

	if ( ! isset( $choices[ $key ] ) ) {
		$choices[ $key ] = [];
	}

	$choices[ $key ]['category_id'] = __( 'Category' );

	return $choices;
}

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

Добавляем возможность выбрать конкретную рубрику

add_filter( 'acf/location/rule_values/category_id', 'acf_location_rules_values_category' );
function acf_location_rules_values_category( $choices ) {
	$terms = get_terms( 'category', [ 'hide_empty' => false ] );

	if ( $terms && is_array( $terms ) ) {
		foreach ( $terms as $term ) {
			$choices[ $term->term_id ] = $term->name;
		}
	}

	return $choices;
}

Теперь опция в выпадающем списке имеет список всех наших рубрик. Писать функционал сохранения значения не нужно, ACF сделает это за нас. Теперь нужно "рассказать" ACF, где выводить форму.

меню

Вывод полей на странице редактирования рубрики

Мы добавили нужные данные в выпадающий список, наш выбор сохраняется, но что делать с сохраненными данными ACF не знает. Расскажем ему:

add_filter( 'acf/location/rule_match/category_id', 'acf_location_rules_match_category', 10, 3 );
function acf_location_rules_match_category( $match, $rule, $options ) {
	$screen = get_current_screen();

	if ( $screen->base !== 'term' || $screen->id !== 'edit-category' ) {
		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;
}

Данный код проверяет, находимся ли мы на странице редактирования указанной в опции рубрики или нет. Если Да, то возвращаем true и форма отображается. Также предусмотрели ситуацию, когда в опциях при составлении условия указано "Не равно".

На этом можно было бы и закончить, но есть проблема: некоторые поля работают по ajax (файл, изображение и т.д.). При ajax запросах нет некоторых глобальных переменных, которые нужны нашему коду, из-за этого в лог сыпятся ошибки. Поэтому нужно проверить, если это админка и не ajax запрос - применить наш код:

if ( is_admin() && ! wp_doing_ajax() ) {
	// Наш код
}

Далее остается только вывести содержимое полей для рубрики в нужном месте шаблона. Если шаблон для рубрик общий, то воспользуйтесь условным тегом is_category().

Полный код из статьи

ACF: Добавление полей к определенной рубрике · GitHub
Скачано: 21, размер: 0
3 коммента
  • Дмитрий, большое спасибо за статью!

    Единственное замечание:
    я бы дополнил ваш скрипт, поместив его в функцию и повесив ее на хук admin_init.
    Это нужно для того, чтобы функция get_current_screen() не срабатывала на страницах сайта, отличных от админки.
    Вот мой вариант скрипта - https://gist.github.com/sxidsvit/3299ce0c29feab3ae915b5c516bde09d

    3
    Ответить4 мес назад #
Здравствуйте, !     Войти . Зарегистрироваться