如何通过pre_get_posts隐藏SKU含-FOC的WooCommerce产品?
解决WooCommerce隐藏含"-FOC" SKU产品的问题
Hey there! Let's break down your problem and fix it properly.
关于WP_Meta_Query的CONTAINS比较选项
你说得完全正确——WP_Meta_Query确实没有CONTAINS这个比较参数。官方支持的比较符包括:=, !=, >, >=, <, <=, LIKE, NOT LIKE, IN, NOT IN, BETWEEN, NOT BETWEEN, EXISTS, NOT EXISTS, REGEXP, NOT REGEXP, RLIKE。如果需要实现"包含"的逻辑,LIKE是官方推荐的替代方案,精准匹配的话可以用正则相关的选项。
你之前方法失败的原因
你的两个尝试都有方向错误,还有小细节问题:
- 选项1用了
LIKE,这是在筛选出包含"-FOC"的产品,而不是排除它们,逻辑完全反了;另外函数里的remove_filter会让这个过滤器只执行一次,后续页面查询不会生效。 - 选项2的正则表达式写错了:
[FOC$]是字符集匹配,会匹配F/O/C/$中的任意单个字符,而不是结尾的"-FOC";同时同样用了REGEXP(筛选)而非NOT REGEXP(排除),方向错误。
正确的解决方案
下面提供两种可行的代码,根据你的需求选择:
方案1:排除所有包含"-FOC"的SKU产品
这个方案会隐藏任何SKU里带有"-FOC"字符串的产品,不管位置:
add_filter( 'pre_get_posts', 'exclude_foc_sku_products' ); function exclude_foc_sku_products( $query ) { // 仅在前台的产品相关页面生效(避免影响后台产品管理) if ( ! is_admin() && $query->is_main_query() && ( $query->is_post_type_archive( 'product' ) || $query->is_tax( 'product_cat' ) || $query->is_tax( 'product_tag' ) ) ) { // 获取已有的meta_query,避免覆盖原有条件 $meta_query = $query->get( 'meta_query', array() ); // 添加排除条件:SKU不包含"-FOC" $meta_query[] = array( 'key' => '_sku', 'value' => '-FOC', 'compare' => 'NOT LIKE', 'type' => 'CHAR' // 可选,帮助数据库优化查询 ); // 确保多条件间的关系为AND(默认就是AND,这里明确设置更稳妥) if ( ! isset( $meta_query['relation'] ) ) { $meta_query['relation'] = 'AND'; } $query->set( 'meta_query', $meta_query ); } return $query; }
方案2:仅排除SKU结尾为"-FOC"的产品
如果你的需求是只隐藏SKU**最后几位是"-FOC"**的产品,用正则匹配更精准:
add_filter( 'pre_get_posts', 'exclude_foc_ending_sku_products' ); function exclude_foc_ending_sku_products( $query ) { if ( ! is_admin() && $query->is_main_query() && ( $query->is_post_type_archive( 'product' ) || $query->is_tax( 'product_cat' ) || $query->is_tax( 'product_tag' ) ) ) { $meta_query = $query->get( 'meta_query', array() ); $meta_query[] = array( 'key' => '_sku', 'value' => '-FOC$', // $表示匹配字符串结尾 'compare' => 'NOT REGEXP', 'type' => 'CHAR' ); if ( ! isset( $meta_query['relation'] ) ) { $meta_query['relation'] = 'AND'; } $query->set( 'meta_query', $meta_query ); } return $query; }
使用注意事项
- 将代码添加到你的主题
functions.php文件,或者使用自定义代码插件(比如Code Snippets) - 测试前请清空WooCommerce和WordPress的缓存,避免旧的查询结果干扰
- 代码限定了前台生效,不会影响你在后台管理产品
内容的提问来源于stack exchange,提问作者danyo
相关产品推荐
相关产品推荐

