如何将含指定标题关键词的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
相关产品推荐
相关产品推荐

