一个特殊的需求,将一个wordpress网站从简体中文换成繁体中文。
在wordpress后台可以更换wordpress语言为繁体中文,但是文章标题、文章内容、分类、标签等等,转化起来就比较麻烦,尝试过几款wordpress插件,都不太好用,最后还是借助强大的OpenCC来实现,以下是步骤:
一、备份数据库
非常重要,一定要先备份原数据库。
二、安装opencc
apt install opencc -y
三、将下面脚本保存为convert_zh_tw_all.sh:
#!/bin/bash
set -e
DB_NAME="dbname"
DB_USER="dbuser"
DB_PASS="你的数据库密码"
TABLE_PREFIX="wp_"
BACKUP_FILE="backup_zhcn_to_zhtw_$(date +%F_%H%M%S).sql"
echo "=== [1] 备份数据库:$BACKUP_FILE ==="
mysqldump -u"$DB_USER" -p"$DB_PASS" --default-character-set=utf8mb4 "$DB_NAME" > "$BACKUP_FILE"
echo "[OK] 数据库已备份"
echo "=== [2] 导出 wp_posts 内容 ==="
mysql -u"$DB_USER" -p"$DB_PASS" --default-character-set=utf8mb4 "$DB_NAME" \
-e "SELECT ID, post_title, post_content, post_excerpt FROM ${TABLE_PREFIX}posts;" > posts.tsv
echo "=== [3] 导出 wp_terms(分类/标签名称) ==="
mysql -u"$DB_USER" -p"$DB_PASS" --default-character-set=utf8mb4 "$DB_NAME" \
-e "SELECT term_id, name FROM ${TABLE_PREFIX}terms;" > terms.tsv
echo "=== [4] 导出 wp_term_taxonomy(分类/标签描述) ==="
mysql -u"$DB_USER" -p"$DB_PASS" --default-character-set=utf8mb4 "$DB_NAME" \
-e "SELECT term_taxonomy_id, description FROM ${TABLE_PREFIX}term_taxonomy;" > term_taxonomy.tsv
echo "=== [5] 使用 OpenCC 将 TSV 转换为繁体 ==="
opencc -i posts.tsv -o posts_tw.tsv -c s2t.json
opencc -i terms.tsv -o terms_tw.tsv -c s2t.json
opencc -i term_taxonomy.tsv -o term_taxonomy_tw.tsv -c s2t.json
echo "=== [6] 生成 SQL 更新脚本(正确处理换行符) ==="
php << 'EOF'
<?php
function escape_mysql($str) {
// 保留真实换行,不转换为 \n 字面符号
$str = str_replace("\\", "\\\\", $str); // 转义反斜杠
$str = str_replace("'", "\\'", $str); // 转义单引号
return $str;
}
# ---------------------------
# posts
# ---------------------------
$fp = fopen("posts_tw.tsv", "r");
$out = fopen("update_posts.sql", "w");
fgets($fp); // 跳过表头
while (($line = fgets($fp)) !== false) {
$cols = explode("\t", $line, 4);
if (count($cols) < 4) continue;
list($id, $title, $content, $excerpt) = $cols;
$id = intval($id);
$title = escape_mysql($title);
$content = escape_mysql($content);
$excerpt = escape_mysql($excerpt);
fwrite($out, "UPDATE wp_posts SET post_title='$title', post_content='$content', post_excerpt='$excerpt' WHERE ID=$id;\n");
}
fclose($fp);
fclose($out);
# ---------------------------
# terms
# ---------------------------
$fp = fopen("terms_tw.tsv", "r");
$out = fopen("update_terms.sql", "w");
fgets($fp);
while (($line = fgets($fp)) !== false) {
$cols = explode("\t", $line, 2);
if (count($cols) < 2) continue;
$id = intval($cols[0]);
$name = escape_mysql($cols[1]);
fwrite($out, "UPDATE wp_terms SET name='$name' WHERE term_id=$id;\n");
}
fclose($fp);
fclose($out);
# ---------------------------
# term_taxonomy
# ---------------------------
$fp = fopen("term_taxonomy_tw.tsv", "r");
$out = fopen("update_term_taxonomy.sql", "w");
fgets($fp);
while (($line = fgets($fp)) !== false) {
$cols = explode("\t", $line, 2);
if (count($cols) < 2) continue;
$id = intval($cols[0]);
$desc = escape_mysql($cols[1]);
fwrite($out, "UPDATE wp_term_taxonomy SET description='$desc' WHERE term_taxonomy_id=$id;\n");
}
fclose($fp);
fclose($out);
echo "[OK] SQL 文件生成完成\n";
?>
EOF
echo "=== [7] 执行 SQL ==="
mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" < update_posts.sql
mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" < update_terms.sql
mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" < update_term_taxonomy.sql
echo "=== ✔✔✔ 全部内容成功转换为繁体中文(不破坏 slug,不破坏格式) ==="
echo "备份文件:$BACKUP_FILE"
chmod +x convert_zh_tw_all.sh
./convert_zh_tw_all.sh
如果报错:
-bash: ./convert_zh_tw_all.sh: /bin/bash^M: bad interpreter: No such file or directory
这是因为脚本 在 Windows 编辑过 → 文件里带有 CRLF(\r\n) →
Linux 解析 shebang 时把 ^M(\r)当成一部分,导致的,直接把脚本转换成 Linux 格式。
先安装dos2unix:
apt install dos2unix
dos2unix convert_zh_tw_all.sh