
本文介绍一种安全、高效的 php 脚本方案,通过 url 触发方式(如 domain.de/start.php?update_cats=yes)批量将 woocommerce 中所有属于指定旧分类(如 cat1)的商品,重新分配至新分类(如 cat2),避免手动操作与插件依赖。
本文介绍一种安全、高效的 php 脚本方案,通过 url 触发方式(如 domain.de/start.php?update_cats=yes)批量将 woocommerce 中所有属于指定旧分类(如 cat1)的商品,重新分配至新分类(如 cat2),避免手动操作与插件依赖。
在 WooCommerce 项目维护中,常需批量调整商品分类结构(例如品牌重组、类目优化或迁移)。手动逐个编辑效率低下且易出错,而借助 WordPress 原生函数编写轻量脚本,既能精准控制逻辑,又无需安装额外插件。
以下是一个经过验证的可部署 PHP 脚本(建议保存为 start.php 并置于网站根目录):
<?php // start.php —— 安全可控的商品分类批量更新脚本
require_once( dirname(__FILE__) . '/wp-load.php' );
if ( isset( $_GET['update_cats'] ) && 'yes' === $_GET['update_cats'] ) {
// 验证管理员权限(强烈建议添加)
if ( ! current_user_can( 'manage_woocommerce' ) ) {
wp_die( '权限不足:仅管理员可执行此操作。' );
}
add_action( 'init', 'change_products_categories' );
}
function change_products_categories() {
// 查询所有属于旧分类(如 'cat-1')的商品
$args = array(
'status' => 'publish',
'limit' => -1, // 获取全部,生产环境建议分批处理(见下方说明)
'category' => array( 'cat-1' ), // 替换为你的旧分类 slug
'return' => 'ids', // 仅返回 ID,减少内存占用
);
$product_ids = wc_get_products( $args );
if ( empty( $product_ids ) ) {
error_log( '未找到属于旧分类的产品。' );
return;
}
$new_category_slug = 'cat-2'; // 替换为你的新分类 slug
foreach ( $product_ids as $product_id ) {
// 注意:wp_set_object_terms 第三个参数为 taxonomy,WooCommerce 分类固定为 'product_cat'
// 第四个参数 true 表示追加(保留其他分类);false 表示替换(移除旧分类,仅保留新分类)
// 此处使用 false 实现「将 cat-1 替换为 cat-2」,即移除旧分类、添加新分类
wp_set_object_terms( $product_id, $new_category_slug, 'product_cat', false );
// 可选:清除该商品缓存以确保前端立即生效
wp_cache_delete( 'product_' . $product_id, 'products' );
}
error_log( sprintf( '成功更新 %d 个商品的分类。', count( $product_ids ) ) );
wp_die( '✅ 分类更新完成!共处理 ' . count( $product_ids ) . ' 个商品。' );
}
? 关键注意事项:
- ✅ 安全性优先:脚本已内置 current_user_can('manage_woocommerce') 权限校验,防止未授权访问;生产环境务必启用。
- ✅ 分类替换逻辑:wp_set_object_terms(..., false) 表示完全替换当前 product_cat 分类,而非追加。若需保留其他已有分类(如 cat1 → cat4,同时保留 cat3),应设为 true 并先手动移除旧分类,或改用 wp_remove_object_terms() + wp_set_object_terms() 组合。
- ⚠️ 性能优化建议:对超千级商品,请勿使用 limit => -1。推荐分页处理(如每次 50 个),配合 AJAX 或 WP-CLI 调用,避免超时或内存溢出。
- ? 分类标识:务必使用分类的 slug(如 'electronics'),而非名称(如 'Electronics'),否则无法匹配。
- ? 上线前测试:先在开发环境运行,检查数据库 wp_term_relationships 表变更,并确认前台归档页与筛选逻辑正常。
执行方式:访问 https://yourdomain.com/start.php?update_cats=yes(需登录管理员账号)。成功后页面显示绿色提示,并记录日志供追溯。完成后建议删除该文件或增加 .htaccess 访问限制,杜绝安全隐患。











