WordPress как на ладони
rgbcode is looking for WordPress developers. Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

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

Advanced Custom Fields (ACF)

В 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().

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

6 комментариев
    Войти