如何修改代码使Elementor AJAX商品小部件隐藏WooCommerce缺货产品
Elementor商品存档小部件开启AJAX后隐藏缺货产品解决方案
失效原因
- 原有代码添加了
!is_admin()判断,而WordPress所有前端AJAX请求都是走后台admin-ajax.php接口,默认会被is_admin()判定为后台请求,导致AJAX场景下过滤逻辑直接被跳过 - Elementor开启AJAX的商品存档小部件部分场景下会调用自身的查询钩子,仅挂载WooCommerce原生钩子无法覆盖AJAX查询场景
修改后兼容AJAX的代码(基于Tax Query实现,适配WooCommerce 3.0+版本)
// 覆盖原生WooCommerce商品小部件查询 add_filter( 'woocommerce_products_widget_query_args', 'custom_hide_outofstock_in_elementor_widget', 10, 1 ); // 覆盖Elementor AJAX场景下的商品查询 add_filter( 'elementor/query/get_query_args', 'custom_hide_outofstock_in_elementor_widget', 10, 1 ); function custom_hide_outofstock_in_elementor_widget( $query_args ) { // 仅排除真正的后台管理页面请求,放行前端AJAX请求 if ( is_admin() && ! wp_doing_ajax() ) { return $query_args; } // 仅针对商品查询生效 if ( isset( $query_args['post_type'] ) && $query_args['post_type'] === 'product' ) { $query_args['tax_query'][] = array( 'taxonomy' => 'product_visibility', 'field' => 'name', 'terms' => array('outofstock'), 'operator' => 'NOT IN' ); } return $query_args; }
使用说明
- 替换你原来的两段代码,将上述代码添加到主题的
functions.php文件或者自定义代码片段插件中即可生效 - 该代码同时兼容AJAX开启和关闭两种场景,无需额外修改小部件配置
- 如果你更习惯使用Meta Query实现,只需要把代码中tax_query部分替换为你原有的meta_query逻辑即可
内容的提问来源于stack exchange,提问作者Acidburns
相关产品推荐
相关产品推荐

