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

如何获取指定格式WooCommerce产品数据并通过$wpdb更新变体?

嘿,我明白你的需求了——你需要把WooCommerce里的变体数据提取成指定格式,方便用外部JSON更新价格对吧?我给你两种靠谱的方案,优先推荐官方API的方式,更稳定:

方案一:使用WooCommerce官方函数(推荐)

这种方式不用直接碰数据库,WooCommerce会帮你处理所有细节,版本更新也不用担心失效。直接查询所有变体产品,然后整理成你要的格式:

// 获取所有已发布的产品变体
$variation_args = array(
    'type' => 'variation',
    'limit' => -1, // 拉取全部变体
    'status' => 'publish',
);
$all_variations = wc_get_products($variation_args);

$formatted_data = array();

foreach ($all_variations as $variation) {
    // 获取父产品信息(如果需要显示父产品名称的话)
    $parent_product = wc_get_product($variation->get_parent_id());
    
    // 构建单个变体的条目,完全匹配你要的格式
    $item = array(
        'id' => $variation->get_id(), // 变体ID,对应示例里的1999/2194
        'name' => $parent_product->get_name(), // 可以改成$variation->get_name()获取变体自身名称
        'SKU' => $variation->get_sku() ?: $parent_product->get_sku(), // 优先用变体SKU,没有就用父产品的
        'variation_data' => array(
            'attribute_name' => '',
            'attribute_value' => '',
            'attribute_price' => wc_price($variation->get_price())
        )
    );

    // 提取变体的属性(这里假设你只有一个'ref'属性,如果有多个可以循环处理)
    foreach ($variation->get_attributes() as $attr_slug => $attr_value) {
        $item['variation_data']['attribute_name'] = wc_attribute_label($attr_slug); // 把属性slug转成友好名称(比如'ref')
        $item['variation_data']['attribute_value'] = $attr_value;
    }

    $formatted_data[] = $item;
}

// 输出成JSON格式(如果需要)
echo json_encode($formatted_data);

代码说明:

  • wc_get_products('variation')直接拉取所有变体,比先查父产品再查变体更高效
  • wc_attribute_label()把属性的slug(比如pa_ref)转换成你要的友好名称(比如ref)
  • wc_price()自动格式化价格为带货币符号的样式(比如$200)

方案二:直接用$wpdb查询数据库(适合高性能场景)

如果产品数量特别多,官方函数可能有点慢,那可以直接查数据库,但要注意备份,而且WooCommerce版本更新可能会改表结构,谨慎使用:

global $wpdb;

// 构建查询语句,关联产品、变体、属性和价格表
$query = $wpdb->prepare("
    SELECT
        v.ID AS variation_id,
        p.post_title AS product_name,
        COALESCE(v_sku.meta_value, p_sku.meta_value) AS product_sku,
        attr.meta_value AS attribute_value,
        price.meta_value AS variation_price,
        REPLACE(attr.meta_key, 'attribute_', '') AS attribute_slug
    FROM {$wpdb->prefix}posts v
    LEFT JOIN {$wpdb->prefix}posts p ON v.post_parent = p.ID
    LEFT JOIN {$wpdb->prefix}postmeta v_sku ON v.ID = v_sku.post_id AND v_sku.meta_key = '_sku'
    LEFT JOIN {$wpdb->prefix}postmeta p_sku ON p.ID = p_sku.post_id AND p_sku.meta_key = '_sku'
    LEFT JOIN {$wpdb->prefix}postmeta attr ON v.ID = attr.post_id AND attr.meta_key LIKE 'attribute_%'
    LEFT JOIN {$wpdb->prefix}postmeta price ON v.ID = price.post_id AND price.meta_key = '_price'
    WHERE v.post_type = 'product_variation'
    AND v.post_status = 'publish'
");

$results = $wpdb->get_results($query);

$formatted_data = array();
foreach ($results as $row) {
    $formatted_data[] = array(
        'id' => $row->variation_id,
        'name' => $row->product_name,
        'SKU' => $row->product_sku,
        'variation_data' => array(
            'attribute_name' => wc_attribute_label($row->attribute_slug),
            'attribute_value' => $row->attribute_value,
            'attribute_price' => wc_price($row->variation_price)
        )
    );
}

echo json_encode($formatted_data);

后续用外部JSON更新价格的方法

拿到格式匹配的数据后,你可以用外部JSON里的attribute_value匹配变体,然后更新价格:

// 假设你的外部JSON数据是这样的
$external_json = '[
    {"attribute_value": "RN20S1", "attribute_price": "$200"},
    {"attribute_value": "RN20S2", "attribute_price": "$210"}
]';
$external_data = json_decode($external_json, true);

foreach ($external_data as $ext_item) {
    // 根据属性值查找对应的变体(这里的'attribute_ref'要换成你实际的属性slug)
    $target_variations = wc_get_products(array(
        'type' => 'variation',
        'limit' => -1,
        'meta_query' => array(
            array(
                'key' => 'attribute_ref',
                'value' => $ext_item['attribute_value'],
                'compare' => '='
            )
        )
    ));

    if (!empty($target_variations)) {
        foreach ($target_variations as $variation) {
            // 提取价格数值(去掉$符号)
            $new_price = floatval(str_replace('$', '', $ext_item['attribute_price']));
            // 更新价格并保存
            $variation->set_price($new_price);
            $variation->set_regular_price($new_price); // 如果需要同步常规价格的话
            $variation->save();
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:12:55