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

如何程序化触发WPML同步WooCommerce多语言产品元数据

程序化触发WooCommerce+WPML产品元数据同步方案

问题场景

我通过代码批量创建WooCommerce多语言产品,按照WPML官方文档实现了标题和描述的翻译同步,但价格、库存、图片、分类等元数据必须手动进入后台点击「快速编辑」→「更新」才能同步到翻译产品。需要通过代码触发这个同步逻辑,避免手动操作。

原创建代码:

$my_translated_post = array(
        'post_title'    => $this->title_en,
        'post_content'  => $this->description_en,
        'post_status'   => $this->status,
        'post_type' => 'product', 
        'post_author'   => 1,       
    ); 
     
    $translated_post_id = wp_insert_post( $my_translated_post );
    
    $wpml_element_type = apply_filters( 'wpml_element_type', 'product' );
    $get_language_args = array('element_id' => $post_id, 'element_type' => 'product' );
    $original_post_language_info = apply_filters( 'wpml_element_language_details', null, $get_language_args );
    $product = wc_get_product( $translated_post_id );      
    $set_language_args = array(
        'element_id'    => $translated_post_id,
        'element_type'  => $wpml_element_type,
        'trid'   => $original_post_language_info->trid,
        'language_code'   => 'en', //language code of secondary language
        'source_language_code' => $original_post_language_info->language_code
    );  
    do_action( 'wpml_set_element_language_details', $set_language_args );
    $product->save();

解决方案

核心是调用WPML的同步钩子,同时手动同步WooCommerce产品的核心关联数据,替代手动点击更新的触发逻辑。修改后的完整代码如下:

$my_translated_post = array(
    'post_title'    => $this->title_en,
    'post_content'  => $this->description_en,
    'post_status'   => $this->status,
    'post_type'     => 'product', 
    'post_author'   => 1,       
); 
 
$translated_post_id = wp_insert_post( $my_translated_post );

$wpml_element_type = apply_filters( 'wpml_element_type', 'product' );
$get_language_args = array(
    'element_id'   => $post_id, 
    'element_type' => 'product' 
);
$original_post_language_info = apply_filters( 'wpml_element_language_details', null, $get_language_args );

// 设置翻译产品的WPML语言关联
$set_language_args = array(
    'element_id'           => $translated_post_id,
    'element_type'         => $wpml_element_type,
    'trid'                 => $original_post_language_info->trid,
    'language_code'        => 'en', // 目标语言代码,按需修改
    'source_language_code' => $original_post_language_info->language_code
);  
do_action( 'wpml_set_element_language_details', $set_language_args );

// 1. 触发WPML自定义字段同步,自动同步大部分元数据
do_action( 'wpml_sync_custom_fields', $translated_post_id, $post_id, 'product' );

// 2. 手动同步WooCommerce核心产品数据
$original_product = wc_get_product( $post_id );
$translated_product = wc_get_product( $translated_post_id );

// 同步价格相关
$translated_product->set_regular_price( $original_product->get_regular_price() );
$translated_product->set_sale_price( $original_product->get_sale_price() );
$translated_product->set_price( $original_product->get_price() );

// 同步库存相关
$translated_product->set_stock_quantity( $original_product->get_stock_quantity() );
$translated_product->set_manage_stock( $original_product->get_manage_stock() );
$translated_product->set_stock_status( $original_product->get_stock_status() );

// 同步产品基础属性
$translated_product->set_type( $original_product->get_type() );
$translated_product->set_sku( $original_product->get_sku() );

// 3. 同步产品图片
$featured_img_id = get_post_thumbnail_id( $post_id );
if ( $featured_img_id ) {
    set_post_thumbnail( $translated_post_id, $featured_img_id );
}

// 同步产品分类
$product_cats = wp_get_post_terms( $post_id, 'product_cat', array( 'fields' => 'ids' ) );
if ( ! empty( $product_cats ) ) {
    wp_set_post_terms( $translated_post_id, $product_cats, 'product_cat' );
}

// 同步产品标签
$product_tags = wp_get_post_terms( $post_id, 'product_tag', array( 'fields' => 'ids' ) );
if ( ! empty( $product_tags ) ) {
    wp_set_post_terms( $translated_post_id, $product_tags, 'product_tag' );
}

// 保存所有修改
$translated_product->save();

// 4. 触发WooCommerce产品更新钩子,确保数据完全生效
do_action( 'woocommerce_update_product', $translated_post_id );

关键逻辑说明

  • wpml_sync_custom_fields:WPML内置钩子,自动同步原产品的自定义字段(包括WooCommerce的部分元数据)
  • 手动同步核心数据:部分WooCommerce属性(如价格、库存)存储在产品对象中,需要直接赋值后保存
  • 关联数据同步:图片、分类、标签属于Post关联数据,通过WordPress原生函数复制关联关系
  • woocommerce_update_product:触发WooCommerce内部的产品更新逻辑,确保所有关联数据被正确处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 18:40:38