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_stock.sh
#!/bin/sh

ROOT_DIR="/www/sites/"
GLOBAL_LOG_FILE="/www/wp-cli/stock_fix_log.txt"
FLAG_NAME=".stock_update"

echo "========= STOCK FIX START $(date) =========" > "$GLOBAL_LOG_FILE"

TOTAL=0
PROCESSED=0
SKIPPED=0
FAILED=0

echo "🚀 开始执行库存修复..."

while IFS= read -r CONFIG_PATH; do

    TOTAL=$((TOTAL + 1))

    SITE_DIR=$(dirname "$CONFIG_PATH")
    FLAG_FILE="$SITE_DIR/$FLAG_NAME"

    echo "--------------------------------------"
    echo "📦 [$TOTAL] 站点: $SITE_DIR"

    if [ -f "$FLAG_FILE" ]; then
        echo "⏭ 已处理"
        SKIPPED=$((SKIPPED + 1))
        continue
    fi

    # 直接执行并捕获输出和退出码
    OUTPUT=$(wp eval '
        global $wpdb;
        
        $updated_stock = $wpdb->query("
            UPDATE {$wpdb->postmeta} pm
            JOIN {$wpdb->posts} p ON pm.post_id = p.ID
            SET pm.meta_value = FLOOR(1000 + (RAND() * 4001))
            WHERE pm.meta_key = '\''_stock'\''
            AND p.post_type IN ('\''product'\'', '\''product_variation'\'')
        ");
        
        $updated_status = $wpdb->query("
            UPDATE {$wpdb->postmeta} pm
            JOIN {$wpdb->posts} p ON pm.post_id = p.ID
            SET pm.meta_value = '\''instock'\''
            WHERE pm.meta_key = '\''_stock_status'\''
            AND p.post_type IN ('\''product'\'', '\''product_variation'\'')
        ");
        
        $updated_manage = $wpdb->query("
            UPDATE {$wpdb->postmeta} pm
            JOIN {$wpdb->posts} p ON pm.post_id = p.ID
            SET pm.meta_value = '\''yes'\''
            WHERE pm.meta_key = '\''_manage_stock'\''
            AND p.post_type IN ('\''product'\'', '\''product_variation'\'')
        ");
        
        $truncate = $wpdb->query("TRUNCATE TABLE {$wpdb->prefix}wc_product_meta_lookup");
        
        // 输出更新统计
        echo "STOCK:" . (int)$updated_stock . "|STATUS:" . (int)$updated_status . "|MANAGE:" . (int)$updated_manage . "|TRUNCATE:" . ($truncate !== false ? "1" : "0");
    ' --path="$SITE_DIR" --allow-root 2>/dev/null)
    
    EXIT_CODE=$?
    
    # 检查是否成功
    if [ $EXIT_CODE -eq 0 ] && echo "$OUTPUT" | grep -q "STOCK:"; then
        touch "$FLAG_FILE"
        echo "✔ 成功 - $OUTPUT"
        echo "SUCCESS: $SITE_DIR - $OUTPUT" >> "$GLOBAL_LOG_FILE"
        PROCESSED=$((PROCESSED + 1))
    else
        echo "✘ 失败 - Exit: $EXIT_CODE, Output: $OUTPUT"
        echo "FAIL: $SITE_DIR - Exit:$EXIT_CODE Output:$OUTPUT" >> "$GLOBAL_LOG_FILE"
        FAILED=$((FAILED + 1))
    fi

done < <(find "$ROOT_DIR" -type f -name "wp-config.php")

echo "======================================"
echo "🎉 执行完成"
echo "总数: $TOTAL"
echo "成功: $PROCESSED"
echo "跳过: $SKIPPED"
echo "失败: $FAILED"
echo "日志: $GLOBAL_LOG_FILE"