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

WooCommerce账户页面展示艺术家属性订单及尺码信息问题

解决WooCommerce订单中variation_id为空时获取尺码的问题

我完全理解你遇到的痛点——部分订单里的variation_id为空,导致没法直接通过get_post_meta提取尺码属性。这种情况通常出现在历史订单、数据同步异常或者特殊的订单创建场景里,不过我们可以通过订单商品项的元数据或SKU来补全尺码信息,下面是具体的解决方案:

核心思路

我们分两步来覆盖所有场景:

  1. 先尝试从订单商品项的元数据直接获取尺码(WooCommerce有时会把属性值存在订单商品的元数据里,即使variation_id为空)
  2. 如果元数据里没有,再根据你的SKU格式解析出尺码(需要根据你店铺的SKU规则调整解析逻辑)

修改后的代码片段

替换你原代码中订单商品项循环的相关部分:

foreach ($order->get_items() as $item_key => $item ):
    $order_product_id = $item->get_product_id();
    $item_name = $item->get_name();
    $quantity = $item->get_quantity();
    $variation_id = $item->get_variation_id();
    
    // 初始化尺码变量
    $variation_size = '';

    // 场景1:有variation_id,直接从变体获取属性
    if ($variation_id) {
        $variation_size = get_post_meta( $variation_id, 'attribute_pa_taille', true);
    } else {
        // 场景2:无variation_id,先尝试从订单商品元数据获取尺码
        $variation_size = $item->get_meta('attribute_pa_taille');
        
        // 场景3:元数据也没有,从SKU解析尺码(根据你的SKU格式调整)
        if (empty($variation_size)) {
            $item_sku = $item->get_meta('_sku');
            // 示例:假设SKU格式为「艺术家-产品名-尺码」,比如"stack-painting-M"
            $sku_parts = explode('-', $item_sku);
            if (!empty($sku_parts)) {
                // 取SKU的最后一段作为尺码
                $extracted_size = end($sku_parts);
                // 验证提取的尺码是否有效(替换成你店铺实际使用的尺码选项)
                $valid_sizes = array('XS', 'S', 'M', 'L', 'XL', 'XXL', '3XL');
                $variation_size = in_array(strtoupper($extracted_size), $valid_sizes) 
                    ? $extracted_size 
                    : '尺码未知';
            }
        }
    }

    // 只显示当前艺术家相关的产品
    if($order_product_id === $productID ) {
        echo "<li>{$item_name} (order_product_id = {$order_product_id}) 数量 = {$quantity}";
        if (!empty($variation_size)) {
            echo " | 尺码: {$variation_size}";
        } else {
            echo " | 尺码未找到";
        }
        echo "</li>";
    }
endforeach;

额外优化建议(可选)

你原有的retrieve_orders_ids_from_a_product_id函数直接操作数据库,虽然能运行,但用WooCommerce官方API更安全且兼容未来版本:

function retrieve_orders_ids_from_a_product_id( $product_id ) {
    return wc_get_orders(array(
        'status' => array('completed'), // 可自定义订单状态,比如添加'processing'
        'limit' => -1,
        'return' => 'ids',
        'meta_query' => array(
            'relation' => 'OR',
            array(
                'key' => '_product_id',
                'value' => $product_id,
                'compare' => '='
            ),
            array(
                'key' => '_variation_id',
                'value' => $product_id,
                'compare' => '='
            )
        )
    ));
}

这样修改后,就能覆盖variation_id为空的所有场景,顺利获取到尺码信息了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 20:42:39