脚本备份
This commit is contained in:
parent
a1b2fb2fd0
commit
f67455e37a
5 changed files with 519 additions and 0 deletions
68
migrate-script.php
Normal file
68
migrate-script.php
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
<?php
|
||||
define('WP_USE_THEMES', false);
|
||||
require_once('/Users/feibisi-studio/Local Sites/mall/app/public/wp-load.php');
|
||||
|
||||
echo "=== YITH 品牌迁移脚本 ===\n\n";
|
||||
|
||||
global $wpdb;
|
||||
|
||||
echo "📊 迁移前数据统计:\n";
|
||||
$yith_brands_before = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->terms} t
|
||||
INNER JOIN {$wpdb->term_taxonomy} tt ON t.term_id = tt.term_id
|
||||
WHERE tt.taxonomy = 'yith_product_brand'");
|
||||
|
||||
$native_brands_before = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->terms} t
|
||||
INNER JOIN {$wpdb->term_taxonomy} tt ON t.term_id = tt.term_id
|
||||
WHERE tt.taxonomy = 'product_brand'");
|
||||
|
||||
echo " YITH 品牌数量: " . ($yith_brands_before ?: 0) . "\n";
|
||||
echo " 原生品牌数量: " . ($native_brands_before ?: 0) . "\n\n";
|
||||
|
||||
if ($yith_brands_before > 0) {
|
||||
echo "🔄 开始迁移 YITH 品牌到原生品牌...\n";
|
||||
|
||||
if ($native_brands_before > 0) {
|
||||
echo "⚠️ 警告:已存在 " . $native_brands_before . " 个原生品牌\n";
|
||||
}
|
||||
|
||||
$wpdb->query('START TRANSACTION');
|
||||
|
||||
try {
|
||||
$result = $wpdb->update(
|
||||
$wpdb->term_taxonomy,
|
||||
array('taxonomy' => 'product_brand'),
|
||||
array('taxonomy' => 'yith_product_brand')
|
||||
);
|
||||
|
||||
if ($result !== false) {
|
||||
echo "✅ 成功迁移 " . $result . " 个品牌\n";
|
||||
$wpdb->query('COMMIT');
|
||||
|
||||
wp_cache_flush();
|
||||
if (function_exists('wc_delete_product_transients')) {
|
||||
wc_delete_product_transients();
|
||||
}
|
||||
|
||||
echo "✅ 缓存已清理\n";
|
||||
|
||||
$yith_brands_after = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->term_taxonomy} WHERE taxonomy = 'yith_product_brand'");
|
||||
$native_brands_after = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->term_taxonomy} WHERE taxonomy = 'product_brand'");
|
||||
|
||||
echo "\n📊 迁移后数据统计:\n";
|
||||
echo " YITH 品牌数量: " . ($yith_brands_after ?: 0) . "\n";
|
||||
echo " 原生品牌数量: " . ($native_brands_after ?: 0) . "\n";
|
||||
|
||||
} else {
|
||||
$wpdb->query('ROLLBACK');
|
||||
echo "❌ 迁移失败\n";
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
$wpdb->query('ROLLBACK');
|
||||
echo "❌ 迁移出错: " . $e->getMessage() . "\n";
|
||||
}
|
||||
|
||||
} else {
|
||||
echo "ℹ️ 未检测到 YITH 品牌数据,无需迁移\n";
|
||||
}
|
||||
|
||||
echo "\n=== 迁移完成 ===\n";
|
||||
64
rollback-script.php
Normal file
64
rollback-script.php
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
<?php
|
||||
define('WP_USE_THEMES', false);
|
||||
require_once('/Users/feibisi-studio/Local Sites/mall/app/public/wp-load.php');
|
||||
|
||||
echo "=== YITH 品牌回滚脚本 ===\n\n";
|
||||
|
||||
global $wpdb;
|
||||
|
||||
echo "📊 回滚前数据统计:\n";
|
||||
$yith_brands_before = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->terms} t
|
||||
INNER JOIN {$wpdb->term_taxonomy} tt ON t.term_id = tt.term_id
|
||||
WHERE tt.taxonomy = 'yith_product_brand'");
|
||||
|
||||
$native_brands_before = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->terms} t
|
||||
INNER JOIN {$wpdb->term_taxonomy} tt ON t.term_id = tt.term_id
|
||||
WHERE tt.taxonomy = 'product_brand'");
|
||||
|
||||
echo " YITH 品牌数量: " . ($yith_brands_before ?: 0) . "\n";
|
||||
echo " 原生品牌数量: " . ($native_brands_before ?: 0) . "\n\n";
|
||||
|
||||
if ($native_brands_before > 0) {
|
||||
echo "🔄 开始回滚原生品牌到 YITH 品牌...\n";
|
||||
|
||||
$wpdb->query('START TRANSACTION');
|
||||
|
||||
try {
|
||||
$result = $wpdb->update(
|
||||
$wpdb->term_taxonomy,
|
||||
array('taxonomy' => 'yith_product_brand'),
|
||||
array('taxonomy' => 'product_brand')
|
||||
);
|
||||
|
||||
if ($result !== false) {
|
||||
echo "✅ 成功回滚 " . $result . " 个品牌\n";
|
||||
$wpdb->query('COMMIT');
|
||||
|
||||
wp_cache_flush();
|
||||
if (function_exists('wc_delete_product_transients')) {
|
||||
wc_delete_product_transients();
|
||||
}
|
||||
|
||||
echo "✅ 缓存已清理\n";
|
||||
|
||||
$yith_brands_after = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->term_taxonomy} WHERE taxonomy = 'yith_product_brand'");
|
||||
$native_brands_after = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->term_taxonomy} WHERE taxonomy = 'product_brand'");
|
||||
|
||||
echo "\n📊 回滚后数据统计:\n";
|
||||
echo " YITH 品牌数量: " . ($yith_brands_after ?: 0) . "\n";
|
||||
echo " 原生品牌数量: " . ($native_brands_after ?: 0) . "\n";
|
||||
|
||||
} else {
|
||||
$wpdb->query('ROLLBACK');
|
||||
echo "❌ 回滚失败\n";
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
$wpdb->query('ROLLBACK');
|
||||
echo "❌ 回滚出错: " . $e->getMessage() . "\n";
|
||||
}
|
||||
|
||||
} else {
|
||||
echo "ℹ️ 未检测到原生品牌数据,无需回滚\n";
|
||||
}
|
||||
|
||||
echo "\n=== 回滚完成 ===\n";
|
||||
39
test-plugin.php
Normal file
39
test-plugin.php
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
define('WP_USE_THEMES', false);
|
||||
require_once('/Users/feibisi-studio/Local Sites/mall/app/public/wp-load.php');
|
||||
|
||||
echo "=== YITH 品牌数据状态检查 ===\n\n";
|
||||
|
||||
global $wpdb;
|
||||
|
||||
echo "🔗 数据库连接状态: ";
|
||||
if ($wpdb->last_error) {
|
||||
echo "❌ 连接失败: " . $wpdb->last_error . "\n";
|
||||
exit(1);
|
||||
} else {
|
||||
echo "✅ 连接正常\n";
|
||||
}
|
||||
|
||||
$yith_brands = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->terms} t
|
||||
INNER JOIN {$wpdb->term_taxonomy} tt ON t.term_id = tt.term_id
|
||||
WHERE tt.taxonomy = 'yith_product_brand'");
|
||||
|
||||
$native_brands = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->terms} t
|
||||
INNER JOIN {$wpdb->term_taxonomy} tt ON t.term_id = tt.term_id
|
||||
WHERE tt.taxonomy = 'product_brand'");
|
||||
|
||||
echo "\n📊 当前数据统计:\n";
|
||||
echo " YITH 品牌数量: " . ($yith_brands ?: 0) . "\n";
|
||||
echo " 原生品牌数量: " . ($native_brands ?: 0) . "\n\n";
|
||||
|
||||
if ($yith_brands > 0) {
|
||||
echo "🔄 检测到 YITH 品牌数据,可以执行迁移\n";
|
||||
echo " 运行命令: php migrate-script.php\n";
|
||||
} elseif ($native_brands > 0) {
|
||||
echo "✅ 检测到原生品牌数据,迁移已完成\n";
|
||||
echo " 如需回滚: php rollback-script.php\n";
|
||||
} else {
|
||||
echo "ℹ️ 未检测到任何品牌数据\n";
|
||||
}
|
||||
|
||||
echo "\n=== 检查完成 ===\n";
|
||||
47
verify-data.php
Normal file
47
verify-data.php
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
<?php
|
||||
define('WP_USE_THEMES', false);
|
||||
require_once('/Users/feibisi-studio/Local Sites/mall/app/public/wp-load.php');
|
||||
|
||||
echo "=== 数据验证脚本 ===\n\n";
|
||||
|
||||
global $wpdb;
|
||||
|
||||
$yith_count = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->term_taxonomy} WHERE taxonomy = 'yith_product_brand'");
|
||||
$native_count = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->term_taxonomy} WHERE taxonomy = 'product_brand'");
|
||||
|
||||
echo "📊 当前数据统计:\n";
|
||||
echo " YITH 品牌数量: " . ($yith_count ?: 0) . "\n";
|
||||
echo " 原生品牌数量: " . ($native_count ?: 0) . "\n\n";
|
||||
|
||||
if ($native_count > 0) {
|
||||
$brands = $wpdb->get_results("
|
||||
SELECT t.name, t.slug, tt.count
|
||||
FROM {$wpdb->terms} t
|
||||
INNER JOIN {$wpdb->term_taxonomy} tt ON t.term_id = tt.term_id
|
||||
WHERE tt.taxonomy = 'product_brand'
|
||||
ORDER BY tt.count DESC
|
||||
LIMIT 10
|
||||
");
|
||||
|
||||
echo "🏷️ 前10个原生品牌:\n";
|
||||
foreach ($brands as $brand) {
|
||||
echo " - " . $brand->name . " (" . $brand->count . "个产品)\n";
|
||||
}
|
||||
|
||||
$relationships = $wpdb->get_var("
|
||||
SELECT COUNT(*) FROM {$wpdb->term_relationships} tr
|
||||
INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
|
||||
WHERE tt.taxonomy = 'product_brand'
|
||||
");
|
||||
|
||||
$meta_count = $wpdb->get_var("
|
||||
SELECT COUNT(*) FROM {$wpdb->termmeta} tm
|
||||
INNER JOIN {$wpdb->term_taxonomy} tt ON tm.term_id = tt.term_id
|
||||
WHERE tt.taxonomy = 'product_brand'
|
||||
");
|
||||
|
||||
echo "\n🔗 产品-品牌关联数量: " . $relationships . "\n";
|
||||
echo "📝 品牌元数据记录: " . $meta_count . "\n";
|
||||
}
|
||||
|
||||
echo "\n=== 验证完成 ===\n";
|
||||
301
wp-cli-migrate-brands.php
Normal file
301
wp-cli-migrate-brands.php
Normal file
|
|
@ -0,0 +1,301 @@
|
|||
<?php
|
||||
/**
|
||||
* WP-CLI 品牌迁移命令
|
||||
*
|
||||
* 使用方法:
|
||||
* wp eval-file wp-cli-migrate-brands.php
|
||||
*
|
||||
* 或者添加参数:
|
||||
* wp eval-file wp-cli-migrate-brands.php --dry-run=true # 预览模式
|
||||
* wp eval-file wp-cli-migrate-brands.php --cleanup=true # 迁移后清理旧数据
|
||||
*/
|
||||
|
||||
if (!defined('WP_CLI') || !WP_CLI) {
|
||||
die('此脚本只能通过 WP-CLI 运行');
|
||||
}
|
||||
|
||||
class WPCLIBrandsMigrator {
|
||||
|
||||
private $old_taxonomy = 'yith_product_brand';
|
||||
private $new_taxonomy = 'product_brand';
|
||||
private $dry_run = false;
|
||||
private $cleanup = false;
|
||||
|
||||
public function __construct() {
|
||||
global $argv;
|
||||
|
||||
$this->dry_run = in_array('--dry-run=true', $argv);
|
||||
$this->cleanup = in_array('--cleanup=true', $argv);
|
||||
|
||||
if ($this->dry_run) {
|
||||
WP_CLI::line('🔍 预览模式:将显示迁移计划但不执行实际操作');
|
||||
}
|
||||
|
||||
$this->run();
|
||||
}
|
||||
|
||||
private function run() {
|
||||
WP_CLI::line('开始 YITH 品牌迁移...');
|
||||
|
||||
if (!$this->check_requirements()) {
|
||||
return;
|
||||
}
|
||||
|
||||
$brands = $this->get_yith_brands();
|
||||
|
||||
if (empty($brands)) {
|
||||
WP_CLI::warning('未找到 YITH 品牌数据');
|
||||
return;
|
||||
}
|
||||
|
||||
WP_CLI::line(sprintf('找到 %d 个品牌需要迁移', count($brands)));
|
||||
|
||||
if ($this->dry_run) {
|
||||
$this->preview_migration($brands);
|
||||
} else {
|
||||
$this->execute_migration($brands);
|
||||
}
|
||||
}
|
||||
|
||||
private function check_requirements() {
|
||||
if (!class_exists('WooCommerce')) {
|
||||
WP_CLI::error('WooCommerce 插件未激活');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!taxonomy_exists($this->old_taxonomy)) {
|
||||
WP_CLI::error('YITH 品牌分类法不存在');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!taxonomy_exists($this->new_taxonomy)) {
|
||||
WP_CLI::line('注册 WooCommerce 原生品牌分类法...');
|
||||
$this->register_product_brand_taxonomy();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private function register_product_brand_taxonomy() {
|
||||
$labels = [
|
||||
'name' => '品牌',
|
||||
'singular_name' => '品牌',
|
||||
'menu_name' => '品牌',
|
||||
'all_items' => '所有品牌',
|
||||
'edit_item' => '编辑品牌',
|
||||
'view_item' => '查看品牌',
|
||||
'update_item' => '更新品牌',
|
||||
'add_new_item' => '添加新品牌',
|
||||
'new_item_name' => '新品牌名称',
|
||||
'search_items' => '搜索品牌',
|
||||
'popular_items' => '热门品牌',
|
||||
'not_found' => '未找到品牌',
|
||||
];
|
||||
|
||||
$args = [
|
||||
'labels' => $labels,
|
||||
'public' => true,
|
||||
'show_ui' => true,
|
||||
'show_in_menu' => true,
|
||||
'show_in_nav_menus' => true,
|
||||
'show_tagcloud' => true,
|
||||
'show_in_quick_edit' => true,
|
||||
'show_admin_column' => true,
|
||||
'hierarchical' => true,
|
||||
'query_var' => true,
|
||||
'rewrite' => ['slug' => 'product-brand', 'with_front' => false],
|
||||
'show_in_rest' => true,
|
||||
];
|
||||
|
||||
register_taxonomy($this->new_taxonomy, ['product'], $args);
|
||||
WP_CLI::success('品牌分类法注册成功');
|
||||
}
|
||||
|
||||
private function get_yith_brands() {
|
||||
return get_terms([
|
||||
'taxonomy' => $this->old_taxonomy,
|
||||
'hide_empty' => false,
|
||||
'number' => 0,
|
||||
]);
|
||||
}
|
||||
|
||||
private function preview_migration($brands) {
|
||||
WP_CLI::line('');
|
||||
WP_CLI::line('📋 迁移预览:');
|
||||
WP_CLI::line('');
|
||||
|
||||
$table_data = [];
|
||||
|
||||
foreach ($brands as $brand) {
|
||||
$product_count = $this->get_brand_product_count($brand->term_id);
|
||||
$existing_brand = get_term_by('slug', $brand->slug, $this->new_taxonomy);
|
||||
$action = $existing_brand ? '更新' : '创建';
|
||||
|
||||
$table_data[] = [
|
||||
'ID' => $brand->term_id,
|
||||
'品牌名称' => $brand->name,
|
||||
'别名' => $brand->slug,
|
||||
'产品数量' => $product_count,
|
||||
'操作' => $action,
|
||||
];
|
||||
}
|
||||
|
||||
WP_CLI\Utils\format_items('table', $table_data, ['ID', '品牌名称', '别名', '产品数量', '操作']);
|
||||
|
||||
WP_CLI::line('');
|
||||
WP_CLI::line('要执行实际迁移,请运行:');
|
||||
WP_CLI::line('wp eval-file wp-cli-migrate-brands.php');
|
||||
}
|
||||
|
||||
private function execute_migration($brands) {
|
||||
$progress = WP_CLI\Utils\make_progress_bar('迁移品牌', count($brands));
|
||||
$migrated_count = 0;
|
||||
$errors = [];
|
||||
|
||||
foreach ($brands as $brand) {
|
||||
try {
|
||||
$this->migrate_single_brand($brand);
|
||||
$migrated_count++;
|
||||
} catch (Exception $e) {
|
||||
$errors[] = sprintf('品牌 "%s" 迁移失败:%s', $brand->name, $e->getMessage());
|
||||
}
|
||||
|
||||
$progress->tick();
|
||||
}
|
||||
|
||||
$progress->finish();
|
||||
|
||||
WP_CLI::line('');
|
||||
WP_CLI::success(sprintf('成功迁移 %d 个品牌', $migrated_count));
|
||||
|
||||
if (!empty($errors)) {
|
||||
WP_CLI::warning('以下品牌迁移时出现错误:');
|
||||
foreach ($errors as $error) {
|
||||
WP_CLI::line(' - ' . $error);
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->cleanup) {
|
||||
$this->cleanup_old_data();
|
||||
} else {
|
||||
WP_CLI::line('');
|
||||
WP_CLI::line('要清理旧数据,请运行:');
|
||||
WP_CLI::line('wp eval-file wp-cli-migrate-brands.php --cleanup=true');
|
||||
}
|
||||
|
||||
wp_cache_flush();
|
||||
}
|
||||
|
||||
private function migrate_single_brand($old_term) {
|
||||
$existing_term = get_term_by('slug', $old_term->slug, $this->new_taxonomy);
|
||||
|
||||
if ($existing_term) {
|
||||
$new_term_id = $existing_term->term_id;
|
||||
|
||||
wp_update_term($new_term_id, $this->new_taxonomy, [
|
||||
'name' => $old_term->name,
|
||||
'description' => $old_term->description,
|
||||
]);
|
||||
} else {
|
||||
$result = wp_insert_term(
|
||||
$old_term->name,
|
||||
$this->new_taxonomy,
|
||||
[
|
||||
'slug' => $old_term->slug,
|
||||
'description' => $old_term->description,
|
||||
]
|
||||
);
|
||||
|
||||
if (is_wp_error($result)) {
|
||||
throw new Exception($result->get_error_message());
|
||||
}
|
||||
|
||||
$new_term_id = $result['term_id'];
|
||||
}
|
||||
|
||||
$this->migrate_term_meta($old_term->term_id, $new_term_id);
|
||||
$this->migrate_product_relationships($old_term->term_id, $new_term_id);
|
||||
}
|
||||
|
||||
private function migrate_term_meta($old_term_id, $new_term_id) {
|
||||
$meta_keys = [
|
||||
'thumbnail_id',
|
||||
'brand_logo',
|
||||
'brand_banner',
|
||||
'brand_url',
|
||||
'brand_email',
|
||||
'brand_description',
|
||||
'yith_wcbr_brand_logo',
|
||||
'yith_wcbr_brand_banner',
|
||||
'yith_wcbr_brand_url',
|
||||
'yith_wcbr_brand_email',
|
||||
];
|
||||
|
||||
foreach ($meta_keys as $meta_key) {
|
||||
$meta_value = get_term_meta($old_term_id, $meta_key, true);
|
||||
if (!empty($meta_value)) {
|
||||
update_term_meta($new_term_id, $meta_key, $meta_value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function migrate_product_relationships($old_term_id, $new_term_id) {
|
||||
global $wpdb;
|
||||
|
||||
$products = $wpdb->get_col($wpdb->prepare("
|
||||
SELECT object_id
|
||||
FROM {$wpdb->term_relationships} tr
|
||||
INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
|
||||
WHERE tt.term_id = %d AND tt.taxonomy = %s
|
||||
", $old_term_id, $this->old_taxonomy));
|
||||
|
||||
foreach ($products as $product_id) {
|
||||
wp_set_object_terms($product_id, [$new_term_id], $this->new_taxonomy, false);
|
||||
}
|
||||
}
|
||||
|
||||
private function get_brand_product_count($term_id) {
|
||||
global $wpdb;
|
||||
|
||||
return $wpdb->get_var($wpdb->prepare("
|
||||
SELECT COUNT(object_id)
|
||||
FROM {$wpdb->term_relationships} tr
|
||||
INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
|
||||
WHERE tt.term_id = %d AND tt.taxonomy = %s
|
||||
", $term_id, $this->old_taxonomy));
|
||||
}
|
||||
|
||||
private function cleanup_old_data() {
|
||||
WP_CLI::line('');
|
||||
WP_CLI::confirm('确定要删除 YITH 品牌的旧数据吗?此操作不可逆!');
|
||||
|
||||
global $wpdb;
|
||||
|
||||
$term_taxonomy_ids = $wpdb->get_col($wpdb->prepare("
|
||||
SELECT term_taxonomy_id
|
||||
FROM {$wpdb->term_taxonomy}
|
||||
WHERE taxonomy = %s
|
||||
", $this->old_taxonomy));
|
||||
|
||||
if (!empty($term_taxonomy_ids)) {
|
||||
$placeholders = implode(',', array_fill(0, count($term_taxonomy_ids), '%d'));
|
||||
|
||||
$relationships_deleted = $wpdb->query($wpdb->prepare("
|
||||
DELETE FROM {$wpdb->term_relationships}
|
||||
WHERE term_taxonomy_id IN ($placeholders)
|
||||
", ...$term_taxonomy_ids));
|
||||
|
||||
$taxonomy_deleted = $wpdb->query($wpdb->prepare("
|
||||
DELETE FROM {$wpdb->term_taxonomy}
|
||||
WHERE taxonomy = %s
|
||||
", $this->old_taxonomy));
|
||||
|
||||
WP_CLI::success(sprintf('清理完成:删除了 %d 个关系记录和 %d 个分类法记录',
|
||||
$relationships_deleted, $taxonomy_deleted));
|
||||
}
|
||||
|
||||
wp_cache_flush();
|
||||
}
|
||||
}
|
||||
|
||||
new WPCLIBrandsMigrator();
|
||||
Loading…
Add table
Add a link
Reference in a new issue