对WooCommerce shop中的shop和Widget使用相同的WP_Query

时间:2016-09-19 作者:gezanoletti

我正在使用WooCommerce和WooCommerce产品类别小部件浏览我的产品。但我需要根据我之前创建的产品属性过滤商店中的所有产品,并使用小部件继续浏览。我找到的解决方案是使用一个查询字符串参数,如“myAtt=my att slug”,仅显示具有前面提到的slug的产品。

这样,我使用的URL如下:

www.mysite。com/商店?myAtt=我的att slug www.mysite。com/产品类别/类别1?myAtt=我的att slug www.mysite。com/产品类别/类别1/子类别11?myAtt=我的att slug www.mysite。com/产品类别/类别2?myAtt=我的att slug此时,我将按两种分类法筛选产品:product\\u cat和myAttr。

为了实现这一点,我修改了WP\\u查询对象,并在查询中添加了一个分类过滤器。它适用于产品,但不适用于小部件呈现的产品类别列表。它似乎正在使用另一个WP\\u查询实例或查询值。

如何为商店和小部件使用相同的WP\\U查询实例?

谢谢你的帮助!!!

下面是我如何修改WP\\u查询实例的,效果很好。我希望这是WordPress方式的正确解决方案。我在函数中执行了以下操作。php关于我的主题:

首先,我注册了在查询字符串param中使用的自定义变量。

function add_query_vars_filter( $vars ){
    $vars[] = \'myAttr\';
    return $vars;
}
add_action( \'query_vars\', \'add_query_vars_filter\' );
接下来,我过滤了店铺查询。。。

function filter_pre_get_posts( $wp_query ) {
    if (!is_archive() || !$wp_query->is_main_query() ) {
        return;
    }

    $myAttr = get_query_var(\'myAttr\');
    if (isSet($myAttr ) && !empty($myAttr )) {
        $wp_query->set(\'tax_query\', array(
            array(
                \'taxonomy\' => \'pa_my-attr\',
                \'field\' => \'slug\',
                \'terms\' => $myAttr ,
                \'include_children\' => true,
                \'operator\' => \'IN\'
            )
        ));
    }
}
add_action(\'pre_get_posts\', \'filter_pre_get_posts\' );
再次感谢!

1 个回复
最合适的回答,由SO网友:Mark Kaplun 整理而成

您的pre_get_posts 筛选器在小部件上不起作用

条件!$wp_query->is_main_query() 使筛选器仅处理主查询而不处理其他查询

您的特殊参数myattr 仅在主查询上“自填充”,但不会自动传播到其他查询。

要使其在小部件上工作,您需要做的第一件事是删除那些在不是邮件查询时退出的条件(您的属性不应在其他查询中设置,因此不应产生影响)。

然后就变得复杂了。您可以通过更改get_query_var(\'myattr\') 进入global $wp_the_query; $wp_the_query->get(\'myattr\',\'\')

但在这种情况下,它会影响页面上的所有查询,这可能是可以的,具体取决于您有什么

另一种选择是找到一种方法来更改小部件本身的查询并注入属性,这似乎毫无意义,因为您对查询所做的实际更改很简单,但如果您只想在一个地方维护更改,这可能是值得的

相关推荐

将wp_Query替换为wp_User_Query

我在插件中制作了一些订阅者档案和单曲(个人资料页),其中我还包括了一个“用户单曲”模板,通过template_include. 不过,我正在尝试从插件中删除一些模板,以使其使用主题模板。我用了locate_template( \'single.php\' ) 从活动主题中选择单个模板。我没有使用全局wp_query 在本例中显示我的内容,但页面显示了基于查询默认值的循环(十篇帖子)。我想知道的是,我是否可以完全放弃默认查询,用wp_user_query 我可以将查询到的用户ID输入其中。然后我想筛选the