You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:59:11