HEX
Server: nginx
System: Linux f62c58717270 6.1.0-17-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.69-1 (2023-12-30) x86_64
User: www-data (1000)
PHP: 8.0.30
Disabled: NONE
Upload Files
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"