php - woocommerce_product_query 不适用于产品类别页面
问题描述
我有自定义过滤器,基于我的 woocommerce 商店中的 URL 参数。在functions.php中我有这样的东西:
add_action( 'woocommerce_product_query', 'filtry1' );
function filtry1( $q ){
$meta_query = $q->get( 'meta_query' );
$meta_query[] = array(
'key' => 'my_custom_key',
'value' => $_GET['my_custom_key'],
'compare' => '=='
);
$q->set( 'meta_query', $meta_query ); }
这在主商店页面上效果很好。我在最后一个查询中看到了额外的 meta_query。
SELECT mysite_posts.ID FROM mysite_posts INNER JOIN mysite_postmeta ON ( mysite_posts.ID = mysite_postmeta.post_id ) WHERE 1=1 AND ( mysite_posts.ID NOT IN ( SELECT object_id FROM mysite_term_relationships WHERE term_taxonomy_id IN (7) ) ) AND ( ( mysite_postmeta.meta_key = 'my_custom_key' AND mysite_postmeta.meta_value = 'VALUE-FROM-$GET' ) ) AND mysite_posts.post_type = 'acf-field' AND ((mysite_posts.post_status = 'publish')) AND mysite_posts.post_name = 'field_61729c0b8644a' GROUP BY mysite_posts.ID ORDER BY mysite_posts.menu_order ASC, mysite_posts.post_title ASC LIMIT 0, 1
但是,如果我们在类别页面中,则此查询不起作用。查询看起来像这样:
SELECT mysite_posts.* FROM mysite_posts WHERE ID IN (86)
解决方案
您可以使用pre_get_posts
动作挂钩。它适用于商店和类别页面。
function filtry1($query) {
if( ! is_admin() && $query->is_main_query() && $query->query_vars['post_type'] == 'product') {
$query->set( 'meta_query', array (
array(
'key' => 'my_custom_key',
'value' => $_GET['my_custom_key'],
'compare' => '=='
)
));
}
}
add_action( 'pre_get_posts', 'filtry1' );
推荐阅读
- python - Can Davinci Resolve (studio) parse a JSON file into text nodes?
- python-3.9 - how to reverse the positions of elements in sets?
- php - Retrieve blob file from database with PDO
- firebase - Firebase Analytics reporting the 'first_open' event when the app is updated, WITHOUT the app being launched
- java - How to specify that an argument of a method should have a specific interface
- wordpress - Woo Commerce Apply Coupon Hook WP Admin Orders Side
- javascript - 材料表可编辑 - 进入和退出编辑模式时是否有回调?
- reactjs - ReactJS 使用 final-form-material-ui 设置数字输入的最小值和最大值
- javascript - 当我尝试踢比机器人角色更高的人时,它会失败但会发送消息
- javascript - 菜单中是否有用于 onclick 事件的首选标签(用于辅助功能)