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
- Gehen Sie zu WooCommerce → Analytics → Umsatz
- Prüfen Sie Ihre Umsatzsummen
- Vergleichen Sie mit den vorherigen (falschen) Daten
- 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:
- 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
- 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
- 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:
- WOOCS-Wechselkurse korrekt?
- Gehen Sie zu den WOOCS-Einstellungen
- Überprüfen Sie, ob die Wechselkurse aktuell sind
- Aktualisieren Sie die Kurse bei Bedarf
- Bestellung mit anderem Kurs verwendet?
- Bestellungen verwenden den Kurs vom Kaufdatum
- Nicht den aktuellen Kurs
- Dies ist korrektes Verhalten
- 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:
- Greifen Sie per FTP auf die Website zu
- Benennen Sie functions.php in functions.php.backup um
- Die Website wird wiederhergestellt
- Überprüfen Sie den Code auf Syntaxfehler
- Prüfen Sie das Fehlerprotokoll auf die genaue Fehlermeldung
Bewährte Vorgehensweisen
- Child-Theme verwenden
- Fügen Sie Code immer zum Child-Theme hinzu
- Updates des Parent-Themes löschen den Code nicht
- Zuerst testen
- Code zuerst auf einer Staging-Site hinzufügen
- Überprüfen, ob die Summen den Erwartungen entsprechen
- Dann auf der Produktivseite anwenden
- Leistung überwachen
- Ladezeit von Analytics vorher/nachher prüfen
- Bei zu langsamer Ladezeit Optimierungen in Betracht ziehen
- WOOCS-Kurse aktuell halten
- Berichte sind nur so genau wie die Wechselkurse
- Kurse regelmäßig aktualisieren
- Automatische Aktualisierung in Betracht ziehen
- Ä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:
- Benutzerdefinierte Datenbanktabelle
- Umrechnungswerte in einer benutzerdefinierten Tabelle speichern
- Bei Bestellaufgabe aktualisieren
- Für Berichte die benutzerdefinierte Tabelle abfragen
- Geplante Umrechnung
- Bestellungen täglich per Cron umrechnen
- In der Bestell-Meta speichern
- Schnelle Berichte mit vorab umgerechneten Daten
- 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.