如何获取指定格式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
相关产品推荐
相关产品推荐

