WordPress多站点中复制指定MySQL行并修改option_name的方法
批量复制WordPress多站点的主题配置项
嘿,针对你这个WordPress多站点的需求,我给你准备了两种靠谱的解决方案——一种是直接用MySQL的存储过程批量处理数据库,另一种是用WordPress原生函数写脚本,更符合WP的操作规范,你可以根据自己的情况选:
方案一:MySQL存储过程(直接操作数据库)
这个方案适合熟悉数据库操作的用户,能一次性批量处理所有子站点的表。核心思路是自动识别所有mywpsite_XX_options格式的表,然后循环每个表复制指定行:
-- 先创建存储过程 DELIMITER // CREATE PROCEDURE CopyThemeMods() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE tableName VARCHAR(255); DECLARE cur CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_name LIKE 'mywpsite\_%\_options' AND table_schema = DATABASE(); -- 只处理当前数据库的表 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; read_loop: LOOP FETCH cur INTO tableName; IF done THEN LEAVE read_loop; END IF; -- 执行插入:复制原theme_mods行,修改option_name,不指定option_id让数据库自增 SET @sql = CONCAT( 'INSERT INTO `', tableName, '` (`option_name`, `option_value`, `autoload`) ', 'SELECT ''theme_mods_my-new-theme'', `option_value`, `autoload` ', 'FROM `', tableName, '` ', 'WHERE `option_name` = ''theme_mods_my-theme'';' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END LOOP; CLOSE cur; END // DELIMITER ; -- 执行存储过程 CALL CopyThemeMods(); -- 执行完可以删除存储过程(可选) DROP PROCEDURE IF EXISTS CopyThemeMods;
注意事项:
- 执行前一定要备份数据库!
- 确保你的MySQL账号有创建存储过程的权限
option_id是自增主键,所以插入时不要指定它,数据库会自动分配唯一ID,避免冲突- 如果某个子站点的表中没有
theme_mods_my-theme行,这条SQL会自动跳过,不会报错
方案二:WordPress自定义脚本(更安全)
如果你不想直接操作数据库,用WordPress的原生函数更稳妥,不会破坏WP的数据库结构。可以写一个临时脚本,放在你的WordPress根目录,执行后删除:
<?php // 加载WordPress环境 require_once('wp-load.php'); // 获取所有子站点 $sites = get_sites(); foreach ($sites as $site) { // 切换到当前子站点 switch_to_blog($site->blog_id); // 获取原主题的配置项 $theme_mods = get_option('theme_mods_my-theme'); if ($theme_mods) { // 插入新的主题配置项,add_option会自动处理不存在的情况,避免重复插入 add_option('theme_mods_my-new-theme', $theme_mods, '', 'yes'); echo "已为站点ID {$site->blog_id} 复制主题配置项<br>"; } else { echo "站点ID {$site->blog_id} 不存在theme_mods_my-theme配置项,跳过<br>"; } // 恢复到主站点 restore_current_blog(); } echo "批量操作完成!"; ?>
使用方法:
- 把这段代码保存为
copy-theme-mods.php,上传到WordPress根目录 - 在浏览器访问你的域名+/copy-theme-mods.php,执行脚本
- 执行完成后立即删除这个文件,避免安全风险
- 同样,操作前记得备份数据库
两种方案都能实现你的需求:自动遍历所有子站点,复制指定的主题配置行,修改名称后插入,原行完全保留。建议先在测试环境测试没问题后,再到生产环境执行。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

