如何程序化触发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
相关产品推荐
相关产品推荐

