如何使用pre_get_posts定位子Woocommerce类别

时间:2014-09-15 21:34:03

标签: php mysql wordpress woocommerce

我创建了一个销售电子书和电子杂志的在线商店,我有一本电子书和电子书#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"类别,因为它们被创建。

请帮忙

1 个答案:

答案 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.