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

修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 23:45:14