
本文介绍如何通过 php 脚本安全、高效地批量更新 woocommerce 商品所属分类,例如将所有属于“cat-1”的商品自动重新归类至“cat-2”,适用于运维或迁移场景。
本文介绍如何通过 php 脚本安全、高效地批量更新 woocommerce 商品所属分类,例如将所有属于“cat-1”的商品自动重新归类至“cat-2”,适用于运维或迁移场景。
在 WooCommerce 项目维护中,常需批量调整商品分类(如品牌重组、类目优化或数据迁移)。手动编辑效率低下且易出错,而使用 WordPress 原生函数结合自定义脚本可实现精准、可控的批量更新。
以下是一个轻量、可部署的 PHP 脚本示例(如保存为 start.php 并通过 https://domain.de/start.php?update_cats=yes 触发):
<?php // start.php —— 确保在 WordPress 环境下运行(建议置于主题根目录或插件目录,并引入 wp-load.php)
require_once( dirname(__FILE__) . '/wp-load.php' );
if ( isset( $_GET['update_cats'] ) && $_GET['update_cats'] === 'yes' ) {
add_action( 'init', 'change_products_categories' );
}
function change_products_categories() {
// 查询所有属于旧分类(如 'cat-1')的商品(支持 slug 或 ID,推荐使用分类 slug)
$args = array(
'status' => 'publish', // 仅处理已发布商品,避免草稿干扰
'category' => array( 'cat-1' ), // 注意:此处为分类 slug,非名称
'limit' => -1, // 获取全部匹配商品(生产环境建议分批处理超大数据集)
'return' => 'ids', // 仅返回商品 ID,减少内存占用
);
$product_ids = wc_get_products( $args );
if ( empty( $product_ids ) ) {
error_log('No products found with category "cat-1".');
wp_die('未找到属于分类 "cat-1" 的已发布商品。');
}
$new_category_slug = 'cat-2'; // 目标新分类 slug(请确保该分类已存在)
foreach ( $product_ids as $product_id ) {
// ⚠️ 关键:使用 wp_set_object_terms 替换(而非追加)分类
// 第四个参数 false 表示不追加,而是完全替换当前 product_cat 分类
$result = wp_set_object_terms( $product_id, $new_category_slug, 'product_cat', false );
if ( is_wp_error( $result ) ) {
error_log("Failed to update category for product {$product_id}: " . $result->get_error_message());
}
}
// 清除相关缓存(WooCommerce 及对象缓存)
wc_delete_product_transients();
clean_post_cache( $product_ids );
wp_die( '✅ 分类更新完成:共 ' . count( $product_ids ) . ' 个商品已从 "cat-1" 迁移至 "' . $new_category_slug . '"。' );
}
✅ 重要注意事项:
- 分类必须存在:请提前在后台创建目标分类(如 cat-2),并确认其 slug 准确无误(可在「产品 → 分类」编辑链接中查看 URL 中的 tag_ID= 或 slug);
- 安全防护:脚本通过 ?update_cats=yes 参数触发,避免被恶意调用;生产环境建议增加管理员权限校验(如 current_user_can('manage_woocommerce'));
- 性能与安全:若商品数量超 500,建议改用 WP-CLI 或分页处理(添加 'offset' 和循环逻辑),防止超时或内存溢出;
- 不可逆操作:执行前务必完整备份数据库,并可在测试站先行验证;
- 分类关系逻辑:wp_set_object_terms(..., ..., 'product_cat', false) 中第 4 参数设为 false 表示完全替换原分类;若设为 true 则为追加,可能导致多分类冗余。
执行成功后,对应商品将不再属于旧分类 cat-1,仅归属新分类 cat-2,前台及后台筛选均实时生效。此方案简洁可靠,是 WooCommerce 批量类目治理的标准实践之一。











