我正在使用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\' );
再次感谢!
最合适的回答,由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\',\'\')
但在这种情况下,它会影响页面上的所有查询,这可能是可以的,具体取决于您有什么
另一种选择是找到一种方法来更改小部件本身的查询并注入属性,这似乎毫无意义,因为您对查询所做的实际更改很简单,但如果您只想在一个地方维护更改,这可能是值得的