WooCommerce账户页面展示艺术家属性订单及尺码信息问题
解决WooCommerce订单中
variation_id为空时获取尺码的问题 我完全理解你遇到的痛点——部分订单里的variation_id为空,导致没法直接通过get_post_meta提取尺码属性。这种情况通常出现在历史订单、数据同步异常或者特殊的订单创建场景里,不过我们可以通过订单商品项的元数据或SKU来补全尺码信息,下面是具体的解决方案:
核心思路
我们分两步来覆盖所有场景:
- 先尝试从订单商品项的元数据直接获取尺码(WooCommerce有时会把属性值存在订单商品的元数据里,即使
variation_id为空) - 如果元数据里没有,再根据你的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
相关产品推荐
相关产品推荐

