将wordpress从简体中文转为繁体中文

一个特殊的需求,将一个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

本文链接: https://www.168itw.com/tech/wordpress-simplified-chinese-to-traditional-chinese/
转载请注明转载自:168itw

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注