如何通过SKU更新WooCommerce产品的wp_postmeta自定义字段
通过SKU跨WooCommerce站点更新
_wc_product_documents字段 方案1:直接用SQL关联更新(同服务器多数据库场景)
如果两个站点的数据库在同一服务器上,可以直接写跨库关联的UPDATE语句。假设:
- 源电商站数据库:
source_db - 目标非电商站数据库:
target_db
先验证匹配结果(安全第一步)
先执行SELECT确认关联是否正确,避免误更新:
SELECT target_p.ID AS target_post_id, source_pm.meta_value AS source_documents, target_sku.meta_value AS sku FROM target_db.wp_posts target_p JOIN target_db.wp_postmeta target_sku ON target_p.ID = target_sku.post_id AND target_sku.meta_key = '_sku' JOIN source_db.wp_postmeta source_sku ON target_sku.meta_value = source_sku.meta_value AND source_sku.meta_key = '_sku' JOIN source_db.wp_postmeta source_pm ON source_sku.post_id = source_pm.post_id AND source_pm.meta_key = '_wc_product_documents' WHERE target_p.post_type = 'product' AND source_pm.meta_value IS NOT NULL;
执行更新语句
确认结果正确后,执行UPDATE:
UPDATE target_db.wp_postmeta target_pm JOIN target_db.wp_posts target_p ON target_pm.post_id = target_p.ID JOIN target_db.wp_postmeta target_sku ON target_p.ID = target_sku.post_id AND target_sku.meta_key = '_sku' JOIN source_db.wp_postmeta source_sku ON target_sku.meta_value = source_sku.meta_value AND source_sku.meta_key = '_sku' JOIN source_db.wp_postmeta source_pm ON source_sku.post_id = source_pm.post_id AND source_pm.meta_key = '_wc_product_documents' SET target_pm.meta_value = source_pm.meta_value WHERE target_p.post_type = 'product' AND target_pm.meta_key = '_wc_product_documents';
方案2:PHP脚本实现(支持跨服务器场景)
如果两个数据库不在同一服务器,或者你更习惯用PHP脚本处理,可以写一个脚本,先从源站拉取SKU和对应的_wc_product_documents数据,再遍历更新目标站。
示例脚本(基于WordPress环境)
把这个脚本放在目标站的根目录(比如update_products_by_sku.php),访问执行即可:
<?php // 加载WordPress环境 require_once('wp-load.php'); // 源站数据库配置 $source_db_config = [ 'host' => '源站数据库地址', 'user' => '源站数据库用户名', 'pass' => '源站数据库密码', 'name' => '源站数据库名', 'prefix' => 'wp_' // 源站wp表前缀 ]; // 连接源站数据库 $source_conn = new mysqli( $source_db_config['host'], $source_db_config['user'], $source_db_config['pass'], $source_db_config['name'] ); if ($source_conn->connect_error) { die("源站数据库连接失败: " . $source_conn->connect_error); } // 从源站获取SKU和对应的文档数据 $source_query = " SELECT sku.meta_value AS product_sku, docs.meta_value AS product_docs FROM {$source_db_config['prefix']}postmeta sku JOIN {$source_db_config['prefix']}postmeta docs ON sku.post_id = docs.post_id JOIN {$source_db_config['prefix']}posts p ON sku.post_id = p.ID WHERE sku.meta_key = '_sku' AND docs.meta_key = '_wc_product_documents' AND p.post_type = 'product' AND docs.meta_value IS NOT NULL "; $result = $source_conn->query($source_query); $sku_docs_map = []; while ($row = $result->fetch_assoc()) { $sku_docs_map[$row['product_sku']] = $row['product_docs']; } $source_conn->close(); // 更新目标站产品 global $wpdb; foreach ($sku_docs_map as $sku => $docs) { // 找到目标站中对应SKU的产品ID $post_id = $wpdb->get_var($wpdb->prepare( "SELECT post_id FROM {$wpdb->prefix}postmeta WHERE meta_key = '_sku' AND meta_value = %s", $sku )); if ($post_id) { // 更新_wc_product_documents字段 $wpdb->update( "{$wpdb->prefix}postmeta", ['meta_value' => $docs], ['post_id' => $post_id, 'meta_key' => '_wc_product_documents'], ['%s'], ['%d', '%s'] ); echo "更新SKU: {$sku} 成功<br>"; } else { echo "未找到SKU: {$sku} 的产品<br>"; } } echo "更新完成"; ?>
注意事项
- 执行任何更新操作前,务必备份两个站点的数据库,避免数据丢失。
- 确保两个站点的SKU是唯一且完全匹配的(大小写、空格都要一致),否则会出现匹配错误。
- 如果是SQL方案,注意表前缀(比如有的站点用
wp_,有的用自定义前缀,要替换成实际的)。 - PHP脚本执行时,要确保服务器允许跨数据库连接,并且有足够的权限。
内容的提问来源于stack exchange,提问作者Kyriakos13
相关产品推荐
相关产品推荐

