File: //www/wp-cli/update_wplang.sh
#!/bin/sh
# ================= 配置 =================
ROOT_DIR="/www/sites/"
MAPPING_FILE="/www/wp-cli/domain_lang_mapping.txt"
GLOBAL_LOG_FILE="/www/wp-cli/wp_lang_update_log.txt"
FLAG_NAME=".wplang_done"
echo "========= WPLANG UPDATE START $(date) =========" > "$GLOBAL_LOG_FILE"
TOTAL=0
PROCESSED=0
SKIPPED=0
FAILED=0
# ================= 检查映射文件 =================
if [ ! -f "$MAPPING_FILE" ]; then
echo "❌ 映射文件不存在: $MAPPING_FILE"
exit 1
fi
# ================= 遍历所有 wp-config.php =================
find "$ROOT_DIR" -type f -name "wp-config.php" | while IFS= read -r CONFIG_PATH; do
TOTAL=$((TOTAL + 1))
CONFIG_DIR=$(dirname "$CONFIG_PATH")
SITE_DIR="$CONFIG_DIR"
FLAG_FILE="$SITE_DIR/$FLAG_NAME"
LOG_FILE="$SITE_DIR/wp_lang_update.log"
echo "--------------------------------------"
echo "站点 $TOTAL: $SITE_DIR"
# 跳过已处理
if [ -f "$FLAG_FILE" ]; then
echo "⏭ 已处理,跳过"
SKIPPED=$((SKIPPED + 1))
continue
fi
# 域名解析
DOMAIN=$(echo "$SITE_DIR" | sed "s|$ROOT_DIR||" 2>/dev/null | cut -d/ -f1 2>/dev/null)
DOMAIN=$(echo "$DOMAIN" | sed 's/^www\.//' 2>/dev/null)
if [ -z "$DOMAIN" ]; then
echo "❌ 域名解析失败"
FAILED=$((FAILED + 1))
continue
fi
echo "🌐 域名: $DOMAIN"
# 查找对应语言
LANG=$(grep "^$DOMAIN:" "$MAPPING_FILE" | head -n1 | cut -d':' -f2)
if [ -z "$LANG" ]; then
echo "⚠ 未匹配到语言,跳过"
SKIPPED=$((SKIPPED + 1))
continue
fi
echo "🌍 目标语言: $LANG"
# ================= PHP eval 更新 WPLANG =================
RESULT=$(wp eval '
global $wpdb;
$lang = "'$LANG'";
$table = $wpdb->prefix . "options";
// 强制写入数据库
$wpdb->query(
$wpdb->prepare(
"INSERT INTO $table (option_name, option_value) VALUES (%s, %s) ON DUPLICATE KEY UPDATE option_value = %s",
"WPLANG", $lang, $lang
)
);
// 刷新缓存,避免后台显示旧值
wp_cache_delete("alloptions", "options");
// 查询最新值
$current = $wpdb->get_var($wpdb->prepare("SELECT option_value FROM $table WHERE option_name=%s", "WPLANG"));
// 输出 JSON
echo json_encode([
"domain" => "'$DOMAIN'",
"target" => $lang,
"wplang" => $current,
"status" => ($current === $lang ? "UPDATED" : "FAIL")
]);
' --path="$SITE_DIR" --allow-root 2>/dev/null)
# ================= 解析结果 =================
STATUS=$(echo "$RESULT" | grep -o '"status":"[^"]*"' | cut -d':' -f2 | tr -d '"')
if [ "$STATUS" = "UPDATED" ]; then
touch "$FLAG_FILE"
echo "$(date '+%Y-%m-%d %H:%M:%S') - $STATUS: $DOMAIN -> $LANG" >> "$LOG_FILE"
echo "✔ $STATUS: $DOMAIN -> $LANG" >> "$GLOBAL_LOG_FILE"
PROCESSED=$((PROCESSED + 1))
else
echo "$(date '+%Y-%m-%d %H:%M:%S') - FAIL: $DOMAIN -> $LANG" >> "$LOG_FILE"
echo "✘ FAIL: $DOMAIN -> $LANG" >> "$GLOBAL_LOG_FILE"
FAILED=$((FAILED + 1))
fi
done
# ================= 总结 =================
echo "========= 完成 ========="
echo "总数: $TOTAL"
echo "成功: $PROCESSED"
echo "跳过: $SKIPPED"
echo "失败: $FAILED"
echo "详细日志请查看站点根目录的 wp_lang_update.log 或全局日志 $GLOBAL_LOG_FILE"