FOX - Currency Switcher for WooCommerce

So korrigieren Sie WooCommerce Analytics-Berichte für Mehrwährungsläden

Wenn Sie einen Multi-Währungs-WooCommerce-Shop mit WOOCS betreiben und Ihre WooCommerce-Analyseberichte falsche Summen anzeigen, hilft Ihnen dieser Leitfaden, das Problem zu beheben.

Das Problem

Symptom: WooCommerce Analytics zeigt falsche Umsatzzahlen, wenn Sie Bestellungen in mehreren Währungen haben. Beispiel:
  • Bestellung #1: 100 USD
  • Bestellung #2: 100 EUR
  • Bestellung #3: 100 GBP
Was WooCommerce Analytics anzeigt:
Total Sales: $300
Das ist FALSCH! WooCommerce addiert verschiedene Währungen ohne Umrechnung: 100 USD + 100 EUR + 100 GBP ≠ 300 USD Die korrekte Berechnung sollte sein:
$100 USD + €100 EUR ($109) + £100 GBP ($127) = $336 USD

Warum das passiert

WooCommerce Analytics unterstützt standardmäßig keine Multi-Währung. Es summiert einfach alle Bestellsummen, ohne die Währung zu prüfen, und behandelt alle Zahlen, als wären sie in Ihrer Basiswährung. Betroffene Berichte:
  • Umsatzberichte
  • Verkäufe nach Datum
  • Produktverkaufsanalysen
  • Steuerberichte
  • Versandberichte
Das betrifft:
  • Geschäftsentscheidungen auf Basis falscher Daten
  • Steuerberechnungen
  • Finanzberichterstattung
  • ROI-Analysen

Die Lösung

Dieser Code rechnet bei der Anzeige von WooCommerce-Analyseberichten alle Bestellungen in Ihre Basiswährung um und liefert so korrekte Summen.

Schritt 1: Code zu Ihrer Website hinzufügen

Fügen Sie diesen Code in die functions.php Ihres Child-Themes ein oder verwenden Sie das Code Snippets-Plugin. Vollständiger Code:
/**
 * Fix WooCommerce Analytics for multi-currency stores (WOOCS)
 * Converts all orders to base currency for accurate reporting
 */
// Clear WooCommerce reports cache (run once, then remove this)
add_action('init', function () {
    if (current_user_can('manage_woocommerce')) {
        global $wpdb;
        $wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '%_wc_report_%'");
        $wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '%wc_admin_report_%'");
    }
});

// Disable Analytics cache to force real-time conversion
add_filter('woocommerce_analytics_enable_cache', '__return_false');

// Convert order totals to base currency in Analytics queries
add_filter('woocommerce_analytics_orders_select_query', function ($results, $args) {
    if (!$results || !isset($results->data) || empty($results->data)) {
        return $results;
    }

    $base_currency = get_woocommerce_currency();

    foreach ($results->data as $key => $order_data) {
        $order_id = $order_data['order_id'];
        $order_currency = get_post_meta($order_id, '_order_currency', true);

        // Only convert if order currency differs from base currency
        if ($order_currency AND $order_currency !== $base_currency) {
            // Get exchange rate from order meta (rate at time of purchase)
            $exchange_rate = get_post_meta($order_id, '_woocs_order_rate', true);

            // Fallback to current rate if historical rate not found
            if (!$exchange_rate) {
                $exchange_rate = woocs_get_exchange_rate($order_currency, $base_currency);
            }

            // Convert all monetary values
            if (isset($order_data['net_total'])) {
                $results->data[$key]['net_total'] = floatval($order_data['net_total']) * floatval($exchange_rate);
            }

            if (isset($order_data['total_sales'])) {
                $results->data[$key]['total_sales'] = floatval($order_data['total_sales']) * floatval($exchange_rate);
            }

            if (isset($order_data['tax_total'])) {
                $results->data[$key]['tax_total'] = floatval($order_data['tax_total']) * floatval($exchange_rate);
            }

            if (isset($order_data['shipping_total'])) {
                $results->data[$key]['shipping_total'] = floatval($order_data['shipping_total']) * floatval($exchange_rate);
            }
        }
    }

    return $results;
}, 10, 2);

/**
 * Helper function to get exchange rate between currencies
 */
function woocs_get_exchange_rate($from_currency, $to_currency) {
    global $WOOCS;

    if (!isset($WOOCS) || !$WOOCS) {
        return 1;
    }

    $currencies = $WOOCS->get_currencies();

    if (isset($currencies[$from_currency]) AND isset($currencies[$to_currency])) {
        $from_rate = floatval($currencies[$from_currency]['rate']);
        $to_rate = floatval($currencies[$to_currency]['rate']);

        if ($from_rate > 0) {
            return $to_rate / $from_rate;
        }
    }

    return 1;
}
 

Schritt 2: Ergebnisse überprüfen

  1. Gehen Sie zu WooCommerce → Analytics → Umsatz
  2. Prüfen Sie Ihre Umsatzsummen
  3. Vergleichen Sie mit den vorherigen (falschen) Daten
  4. Die Summen sollten nun korrekt in Ihre Basiswährung umgerechnet sein

Wie es funktioniert

Teil 1: Cache leeren

add_action('init', function () {
    global $wpdb;
    $wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '%_wc_report_%'");
    ...
});
Was es tut: Löscht alte Cache-Berichte, die falsche Daten enthalten Dieser Code wird nur für Admin-Benutzer ausgeführt

Teil 2: Analytics-Cache deaktivieren

add_filter('woocommerce_analytics_enable_cache', '__return_false');
Was es tut: Zwingt WooCommerce Analytics, die Daten bei jedem Aufruf neu zu berechnen, anstatt zwischengespeicherte Werte zu verwenden Kompromiss: Berichte werden möglicherweise etwas langsamer geladen, aber die Daten sind immer korrekt

Teil 3: Bestellsummen umrechnen

add_filter('woocommerce_analytics_orders_select_query', function ($results, $args) {
    // Convert each order to base currency
    ...
});
Was es tut:
  • Fängt Analytics-Datenbankabfragen ab
  • Prüft die Währung jeder Bestellung
  • Wenn sie von der Basiswährung abweicht, wird der Wechselkurs zur Umrechnung verwendet
  • Gibt die umgerechneten Werte an Analytics zurück

Teil 4: Wechselkurs-Funktion

function woocs_get_exchange_rate($from_currency, $to_currency) {
    // Calculate conversion rate between currencies
    ...
}
Was es tut:
  • Holt aktuelle Wechselkurse von WOOCS
  • Berechnet den Umrechnungskurs zwischen zwei Währungen
  • Wird als Fallback verwendet, wenn kein historischer Kurs gefunden wird

Wichtige Hinweise

Historische vs. aktuelle Wechselkurse

Der Code verwendet nach Möglichkeit historische Kurse:
$exchange_rate = get_post_meta($order_id, '_woocs_order_rate', true);
Warum das wichtig ist:
  • Bestellung von vor 6 Monaten: Der damalige Wechselkurs wird verwendet
  • Genauere Finanzberichterstattung
  • Zeigt den tatsächlichen Umsatz zum Zeitpunkt des Verkaufs
Fallback: Wenn kein historischer Kurs verfügbar ist, wird der aktuelle Kurs von WOOCS verwendet.

Auswirkungen auf die Leistung

Was sich ändert:
  • ✅ Korrekte Multi-Währungs-Berichte
  • ❌ Berichte werden 0,5–2 Sekunden langsamer geladen (kein Cache)
  • ❌ Erhöhte Datenbankabfragen
Empfehlung:
  • Kleine Shops (< 1.000 Bestellungen/Monat): Vernachlässigbare Auswirkungen
  • Mittlere Shops (1.000–10.000 Bestellungen/Monat): Leichte Verlangsamung für Genauigkeit akzeptabel
  • Große Shops (10.000+ Bestellungen/Monat): Leistung überwachen, Optimierung erwägen

Cache deaktiviert

add_filter('woocommerce_analytics_enable_cache', '__return_false');
Dies ist notwendig, da zwischengespeicherte Berichte gemischte Währungen anzeigen würden. Die Umrechnung erfolgt bei jedem Berichtsaufruf in Echtzeit. Alternativer Ansatz für große Shops:
  • Zeile zum Deaktivieren des Caches entfernen
  • Cache manuell leeren, wenn sich Wechselkurse erheblich ändern
  • Kleine Ungenauigkeit für bessere Leistung in Kauf nehmen

Fehlerbehebung

Berichte zeigen immer noch falsche Summen

Problem: Zahlen haben sich nach dem Hinzufügen des Codes nicht geändert Lösungen:
  1. Cache nicht geleert
    • Stellen Sie sicher, dass der Cache-Leerungs-Code ausgeführt wurde
    • Besuchen Sie das Admin-Panel, während Sie als Admin angemeldet sind
    • Prüfen Sie, ob Sie die manage_woocommerce-Fähigkeit haben
  2. Code nicht aktiv
    • Überprüfen Sie, ob der Code in der functions.php (Child-Theme) vorhanden ist
    • Oder überprüfen Sie, ob das Code Snippets-Plugin das Snippet aktiviert hat
    • Suchen Sie im Debug-Log nach PHP-Fehlern
  3. Falsche Basiswährung
    • Überprüfen Sie die Basiswährung unter WooCommerce → Einstellungen → Allgemein
    • Stellen Sie sicher, dass WOOCS dieselbe Basiswährung anzeigt

Berichte laden langsam

Problem: Analytics benötigt 5–10+ Sekunden zum Laden Ursachen:
  • Große Bestelldatenbank (10.000+ Bestellungen)
  • Viele Währungsumrechnungen erforderlich
  • Begrenzte Serverressourcen
Lösungen: Lösung 1: Datumsbereich eingrenzen
// Only convert recent orders (last 12 months)
add_filter('woocommerce_analytics_orders_select_query', function ($results, $args) {
    if (!$results || !isset($results->data)) {
        return $results;
    }
    
    $twelve_months_ago = strtotime('-12 months');
    
    foreach ($results->data as $key => $order_data) {
        $order_date = strtotime($order_data['date_created']);
        
        // Skip old orders
        if ($order_date < $twelve_months_ago) {
            continue;
        }
        
        // ... conversion code ...
    }
    
    return $results;
}, 10, 2);
Lösung 2: Cache für bestimmte Berichte wieder aktivieren Entfernen Sie die Zeile zum Deaktivieren des Caches und leeren Sie den Cache bei Bedarf manuell. Lösung 3: Externe Berichterstattung nutzen Erwägen Sie dedizierte Analyse-Plugins für große Shops.

Wechselkurse nicht gefunden

Problem: Einige Bestellungen zeigen die ursprüngliche Währung, nicht umgerechnet Ursache: Der Bestellung fehlt die _woocs_order_rate-Meta und WOOCS hat diese Währung nicht mehr Lösung: Standard-Kurszuordnung hinzufügen:
function woocs_get_exchange_rate($from_currency, $to_currency) {
    global $WOOCS;
    
    if (!isset($WOOCS) || !$WOOCS) {
        // Fallback rates if WOOCS not available
        $fallback_rates = [
            'EUR' => 1.09,  // EUR to USD
            'GBP' => 1.27,  // GBP to USD
            'CAD' => 0.74,  // CAD to USD
            'AUD' => 0.66,  // AUD to USD
        ];
        
        if (isset($fallback_rates[$from_currency])) {
            return $fallback_rates[$from_currency];
        }
        
        return 1;
    }
    
    $currencies = $WOOCS->get_currencies();
    
    if (isset($currencies[$from_currency]) AND isset($currencies[$to_currency])) {
        $from_rate = floatval($currencies[$from_currency]['rate']);
        $to_rate = floatval($currencies[$to_currency]['rate']);
        
        if ($from_rate > 0) {
            return $to_rate / $from_rate;
        }
    }
    
    return 1;
}

Umrechnungen sehen falsch aus

Problem: Umgerechnete Beträge entsprechen nicht den erwarteten Werten Prüfen:
  1. WOOCS-Wechselkurse korrekt?
    • Gehen Sie zu den WOOCS-Einstellungen
    • Überprüfen Sie, ob die Wechselkurse aktuell sind
    • Aktualisieren Sie die Kurse bei Bedarf
  2. Bestellung mit anderem Kurs verwendet?
    • Bestellungen verwenden den Kurs vom Kaufdatum
    • Nicht den aktuellen Kurs
    • Dies ist korrektes Verhalten
  3. Basiswährung korrekt?
    // Add debug to see what's happening
       error_log('Order: ' . $order_id);
       error_log('Currency: ' . $order_currency);
       error_log('Rate: ' . $exchange_rate);
       error_log('Original: ' . $order_data['total_sales']);
       error_log('Converted: ' . ($order_data['total_sales'] * $exchange_rate));
     

Code führt zu Website-Ausfall

Problem: Weißer Bildschirm oder Fehler nach dem Hinzufügen des Codes Ursache: PHP-Syntaxfehler oder Konflikt Lösung:
  1. Greifen Sie per FTP auf die Website zu
  2. Benennen Sie functions.php in functions.php.backup um
  3. Die Website wird wiederhergestellt
  4. Überprüfen Sie den Code auf Syntaxfehler
  5. Prüfen Sie das Fehlerprotokoll auf die genaue Fehlermeldung

Bewährte Vorgehensweisen

  1. Child-Theme verwenden
    • Fügen Sie Code immer zum Child-Theme hinzu
    • Updates des Parent-Themes löschen den Code nicht
  2. Zuerst testen
    • Code zuerst auf einer Staging-Site hinzufügen
    • Überprüfen, ob die Summen den Erwartungen entsprechen
    • Dann auf der Produktivseite anwenden
  3. Leistung überwachen
    • Ladezeit von Analytics vorher/nachher prüfen
    • Bei zu langsamer Ladezeit Optimierungen in Betracht ziehen
  4. WOOCS-Kurse aktuell halten
    • Berichte sind nur so genau wie die Wechselkurse
    • Kurse regelmäßig aktualisieren
    • Automatische Aktualisierung in Betracht ziehen
  5. Änderungen dokumentieren
    • Notieren Sie, wann Sie diesen Code hinzugefügt haben
    • Sicherungskopie von functions.php aufbewahren
    • Erleichtert die Fehlerbehebung

Alternative Lösungen

Für sehr große Shops

Wenn Sie 50.000+ Bestellungen haben und diese Lösung zu langsam ist, ziehen Sie Folgendes in Betracht:
  1. Benutzerdefinierte Datenbanktabelle
    • Umrechnungswerte in einer benutzerdefinierten Tabelle speichern
    • Bei Bestellaufgabe aktualisieren
    • Für Berichte die benutzerdefinierte Tabelle abfragen
  2. Geplante Umrechnung
    • Bestellungen täglich per Cron umrechnen
    • In der Bestell-Meta speichern
    • Schnelle Berichte mit vorab umgerechneten Daten
  3. Externe Analysen
    • Export nach Google Analytics mit korrekter Währungsbehandlung
    • Dedizierte E-Commerce-Analyseplattform nutzen
    • Third-Party-WooCommerce-Berichts-Plugins

Für Shops mit wenigen Währungen

Wenn Sie nur 2–3 Währungen verwenden, können Sie es vereinfachen:
// Hardcoded rates for specific currencies
add_filter('woocommerce_analytics_orders_select_query', function ($results, $args) {
    if (!$results || !isset($results->data)) {
        return $results;
    }
    
    $rates = [
        'EUR' => 1.09,
        'GBP' => 1.27,
        'USD' => 1.00,  // Base currency
    ];
    
    foreach ($results->data as $key => $order_data) {
        $order_id = $order_data['order_id'];
        $order_currency = get_post_meta($order_id, '_order_currency', true);
        
        if (isset($rates[$order_currency])) {
            $rate = $rates[$order_currency];
            $results->data[$key]['total_sales'] = $order_data['total_sales'] * $rate;
            // ... convert other fields
        }
    }
    
    return $results;
}, 10, 2);
Das ist schneller, erfordert aber manuelle Kursaktualisierungen.

Zusammenfassung

Das Problem: WooCommerce Analytics addiert verschiedene Währungen ohne Umrechnung und zeigt falsche Summen an. Die Lösung: Code hinzufügen, der alle Bestellungen mithilfe von Wechselkursen aus WOOCS in die Basiswährung umrechnet. Kompromisse:
  • ✅ Korrekte Multi-Währungs-Berichte
  • ✅ Verwendung historischer Wechselkurse
  • ❌ Berichte 0,5–2 Sekunden langsamer (kein Cache)
  • ❌ Nicht geeignet für sehr große Shops (50.000+ Bestellungen)
Ergebnis: WooCommerce Analytics zeigt korrekte Umsatzdaten an, wobei alle Bestellungen in Ihre Basiswährung umgerechnet wurden.