修复WooCommerce插件:使变体在分类及所有Taxonomy页面显示
修复WooCommerce变体独立展示插件(支持分类及所有Taxonomy页面)
问题分析
原插件存在三个核心问题导致分类/ Taxonomy页面失效:
- 未隐藏父可变产品,不符合需求
- 分组逻辑错误,普通产品会因无颜色属性被合并为一条
- 查询触发逻辑在Taxonomy页面未完全生效
修复后的完整代码
<?php /** * Plugin Name: WooCommerce Display One Variation Per Color and Regular Products * Description: Displays only one variation per color and all regular products on all product listing pages, including category pages. * Version: 1.1 * Author: Atanas Kostadinov * Text Domain: wc-display-one-per-color-and-regular */ if (!defined('ABSPATH')) exit; // Exit if accessed directly // 修改主查询:包含变体,排除父可变产品,在所有产品列表页生效 add_action('pre_get_posts', function ($query) { if (!is_admin() && $query->is_main_query() && (is_shop() || is_product_taxonomy() || is_post_type_archive('product'))) { // 设置查询类型为产品和变体 $query->set('post_type', ['product', 'product_variation']); // 排除父可变产品(隐藏父产品) $query->set('meta_query', [ 'relation' => 'OR', // 普通产品:排除可变类型 [ 'key' => '_product_type', 'value' => 'variable', 'compare' => '!=', 'type' => 'CHAR', ], // 产品变体:无_product_type元数据,直接包含 [ 'key' => '_product_type', 'compare' => 'NOT EXISTS', ] ]); } }); // 调整SQL子句:变体按颜色分组取一个,普通产品正常展示 add_filter('posts_clauses', function ($clauses, $query) { global $wpdb; // 仅在目标查询中生效 if (!is_admin() && $query->is_main_query() && (is_shop() || is_product_taxonomy() || is_post_type_archive('product')) && in_array('product_variation', (array)$query->get('post_type'))) { // 保留原始字段并添加区分用字段 $original_fields = $clauses['fields']; $clauses['fields'] = "{$original_fields}, {$wpdb->posts}.post_type, {$wpdb->postmeta}.meta_value AS color_attribute"; // 关联颜色属性元数据 $clauses['join'] .= " LEFT JOIN {$wpdb->postmeta} ON ({$wpdb->posts}.ID = {$wpdb->postmeta}.post_id AND {$wpdb->postmeta}.meta_key = 'attribute_pa_color')"; // 分组逻辑:变体按颜色分组,普通产品按ID分组(不合并) $clauses['groupby'] = " CASE WHEN {$wpdb->posts}.post_type = 'product_variation' THEN {$wpdb->postmeta}.meta_value ELSE {$wpdb->posts}.ID END "; // 排序逻辑:先普通产品,再变体按ID升序 $clauses['orderby'] = "{$wpdb->posts}.post_type ASC, {$wpdb->posts}.ID ASC"; } return $clauses; }, 10, 2); // 变体标题添加颜色属性 add_filter('the_title', function ($title, $id) { $product = wc_get_product($id); if ($product && $product->is_type('variation')) { $color = $product->get_attribute('pa_color'); return $product->get_title() . ($color ? ' - ' . $color : ''); } return $title; }, 10, 2);
关键修复点说明
- 隐藏父产品:通过
meta_query排除产品类型为variable的父产品,只保留普通产品和变体 - 兼容所有产品列表页:明确判断
is_shop()、is_product_taxonomy()、is_post_type_archive('product'),确保商店、分类、标签等页面都触发修改 - 修复分组逻辑:用
CASE语句区分普通产品和变体,普通产品按ID分组不合并,变体按颜色分组只显示一个 - 优化SQL关联:精确匹配
attribute_pa_color元键,避免模糊查询的性能问题
内容的提问来源于stack exchange,提问作者Atanas Kostadinov
相关产品推荐
相关产品推荐

