我创建了一个销售电子书和电子杂志的在线商店,我有一本电子书和电子书#34;有儿童类别的产品类别和我有杂志的杂志"杂志"类别与儿童类别如"女性","男性"和" business"。对于电子杂志,我创建了一个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"类别,因为它们被创建。
请帮忙
答案 0 :(得分:0)
这是未经测试的,但这样的事情应该有效。这首先通过它的slug来获取你正在寻找的术语(为了更容易识别),然后抓住所有作为目标术语后代的术语。我不记得在查询中是否返回原始父项,因此如果不是,则在术语查询后取消注释该行:
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']
返回什么,但是如果它是术语slug,请考虑更改为:
$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.