Sklep z konfiguracją multi-store (5 sklepów, 3 waluty) zaczął pokazywać błędne ceny – cena w euro pojawiała się na sklepie w złotówkach i odwrotnie. Problem pojawił się po dodaniu nowego sklepu i dotyczył tylko produktów z regułami cen. Czas naprawy: 6 godzin.
Objawy
- Ceny w złe walucie na wybranych sklepach
- Problem tylko dla produktów z catalog price rules
- Reindeks nie pomaga
- W
catalogrule_product_pricezduplikowane wpisy dla różnych store_id z tymi samymi cenami
Diagnoza
-- Sprawdź reguły cen dla produktu w różnych sklepach
SELECT
crpp.product_id,
crpp.website_id,
crpp.customer_group_id,
crpp.rule_price,
w.name as website_name
FROM catalogrule_product_price crpp
JOIN store_website w ON w.website_id = crpp.website_id
WHERE crpp.product_id = 123
ORDER BY crpp.website_id, crpp.customer_group_id;
-- Sprawdź konfigurację walut per website
SELECT scope_id, value
FROM core_config_data
WHERE path = 'currency/options/base'
ORDER BY scope_id;
Przyczyna
Nowy sklep został dodany przez skopiowanie konfiguracji istniejącego sklepu. Wartość currency/options/base pozostała z oryginalnego sklepu (EUR zamiast PLN). Reguły cen przeliczały po złym kursie bazowym. Dodatkowo cache reguł cenowych nie był powiązany z website_id – jeden sklep nadpisywał cache drugiego.
Rozwiązanie
# Napraw konfigurację waluty bazowej per website bin/magento config:set --scope=websites --scope-code=pl_store currency/options/base PLN bin/magento config:set --scope=websites --scope-code=eu_store currency/options/base EUR # Wyczyść i przebuduj reguły cenowe bin/magento catalogrule:apply bin/magento indexer:reindex catalogrule_rule catalogrule_product # Wyczyść cache bin/magento cache:flush
<?php
// Prewencja: zawsze sprawdzaj store context przy pobieraniu ceny
class PriceProvider
{
public function getPrice(int $productId, int $storeId): float
{
// Ustaw poprawny store context
$store = $this->storeManager->getStore($storeId);
$this->storeManager->setCurrentStore($store);
try {
return (float)$this->product->load($productId)->getFinalPrice();
} finally {
// Przywróć oryginalny store
$this->storeManager->setCurrentStore($this->storeManager->getDefaultStoreView());
}
}
}
Wnioski
Tworzenie nowych sklepów przez kopiowanie konfiguracji jest ryzykowne – zawsze sprawdź walutę bazową, strefę czasową i locale po dodaniu sklepu. W multi-store każda operacja na cenach wymaga jawnego ustawienia store context, inaczej używany jest domyślny store.
