Я создал интернет-магазин, в котором продаются электронные книги и электронные журналы, для книг у меня есть категория продуктов «электронные книги» с дочерними категориями, а для журналов у меня есть категория «электронные журналы» с дочерними категориями, такими как «женщины», «мужчины». «и» бизнес «. Для электронных журналов я создал функцию pre_get_posts, которая предназначена для изменения запросов ко всему разделу журналов моего магазина. Вот код, который у меня есть
function magazine_filter($query) {
if ( !is_admin() && $query->is_main_query() && $query->query_vars['product_cat'] == 'emagazines' :
// My code goes here
endif ;
}
add_action('pre_get_posts','magazine_filter');
Проблема в том, что после того, как я нацелился на категорию «emagazines», моя функция влияет только на категорию eMagazines, а не на такие дочерние категории, как «Женщины», «Мужчины», «Бизнес» и т. Д. Очевидным решением будет вручную настроить таргетинг на все мои подкатегории. как хорошо, но это слишком долго. Я хочу, чтобы это было динамичным, чтобы эта функция всегда предназначалась для любых дочерних категорий категории «eMagazines» при их создании.
Пожалуйста помоги
Это не проверено, но что-то вроде этого должно работать. Сначала он захватывает искомый термин (для облегчения идентификации), а затем захватывает все термины, которые являются потомками целевого термина. Я не могу вспомнить, возвращается ли исходный родительский термин в результате запроса, поэтому, если это не так, раскомментируйте строку после термина запроса:
function magazine_filter($query) {
$emag = get_term_by('slug', 'emagazines', 'product_cat');
$tree = get_terms('product_cat', array(
'fields'=>'ids', //Should be 'ids' not 'id'
'hide_empty'=>false,
'child_of'=>$emag->term_id
));
//$tree[] = $emag->term_id; //Uncomment this if the emagazines term ID isn't included.
if ( !is_admin() && $query->is_main_query() && in_array($query->query_vars['product_cat'], $tree) ) :
// My code goes here
endif ;
}
add_action('pre_get_posts','magazine_filter');
РЕДАКТИРОВАТЬ: Вот документация на get_terms. Первоначально аргумент ‘fields’ был установлен как 'id'
вместо 'ids'
что вызывало проблемы.
Я не знаю что $query->query_vars['product_cat']
возвращается, но если это термин «слизняк», подумайте об изменении на:
$tree = get_terms('product_cat', array(
'fields'=>'id=>slug',
'hide_empty'=>false,
'child_of'=>$emag->term_id
));
//$tree[$emag->term_id] = $emag->slug; //Uncomment this if the emagazines term slug isn't included.
Других решений пока нет …