Как таргетировать дочерние категории Woocommerce с помощью pre_get_posts

Я создал интернет-магазин, в котором продаются электронные книги и электронные журналы, для книг у меня есть категория продуктов «электронные книги» с дочерними категориями, а для журналов у меня есть категория «электронные журналы» с дочерними категориями, такими как «женщины», «мужчины». «и» бизнес «. Для электронных журналов я создал функцию 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» при их создании.

Пожалуйста помоги

0

Решение

Это не проверено, но что-то вроде этого должно работать. Сначала он захватывает искомый термин (для облегчения идентификации), а затем захватывает все термины, которые являются потомками целевого термина. Я не могу вспомнить, возвращается ли исходный родительский термин в результате запроса, поэтому, если это не так, раскомментируйте строку после термина запроса:

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.
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]