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

如何将含指定标题关键词的WooCommerce商品移至归档列表末尾

在WooCommerce归档页将含特定关键词的商品移至列表末尾(兼容缺货商品排序)

要实现把标题包含指定关键词(比如示例中的“etui”)的商品放到商店、商品分类/标签页的列表末尾,同时保留你已实现的缺货商品后置功能,直接在数据库查询层面修改排序逻辑是最优方案,效率远高于PHP层面的数组调整。

以下是整合后的完整代码,替换你原有的缺货排序代码即可:

if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) {
    add_filter('posts_clauses', 'order_by_stock_status_and_keyword_in_title', 2000);
}

function order_by_stock_status_and_keyword_in_title($posts_clauses) {
    global $wpdb;
  
    // 仅在WooCommerce归档页面生效
    if (is_woocommerce() && (is_shop() || is_product_category() || is_product_tag())) {
        // 关联库存状态元数据表
        $posts_clauses['join'] .= " INNER JOIN $wpdb->postmeta istockstatus ON ($wpdb->posts.ID = istockstatus.post_id) ";
        
        // 定义需要匹配的目标关键词,直接修改此处即可更换关键词
        $target_keyword = 'etui';
        
        // 构建排序优先级:标题不含关键词的在前 → 库存状态正常的在前 → 保留原有排序规则
        $posts_clauses['orderby'] = "
            CASE WHEN LOWER($wpdb->posts.post_title) LIKE '%".esc_sql($target_keyword)."%' THEN 1 ELSE 0 END ASC,
            istockstatus.meta_value ASC,
            " . $posts_clauses['orderby'];
            
        // 过滤库存状态的有效数据
        $posts_clauses['where'] = " AND istockstatus.meta_key = '_stock_status' AND istockstatus.meta_value <> '' " . $posts_clauses['where'];
    }
    return $posts_clauses;
}

关键细节说明:

  • 用CASE语句标记标题含关键词的商品,标记为1的商品会在ASC排序后置,确保不含关键词的商品优先显示
  • 排序优先级:标题关键词判断 > 库存状态排序 > 原有默认排序,同时满足两个后置需求
  • 用LOWER()和关键词匹配实现不区分大小写的搜索,不需要的话直接去掉LOWER()即可
  • esc_sql()处理关键词,避免SQL注入风险
  • 保留了你原有的库存状态关联与过滤逻辑,确保缺货商品仍会移至末尾

扩展提示:

如果需要匹配多个关键词,可修改CASE语句的判断条件:

CASE WHEN (LOWER($wpdb->posts.post_title) LIKE '%keyword1%' OR LOWER($wpdb->posts.post_title) LIKE '%keyword2%') THEN 1 ELSE 0 END ASC

内容的提问来源于stack exchange,提问作者HexFix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:38:24