PHP / Magento Dev Blog

  • Publikacje
  • O autorze
  • Kontakt

Magento 2 błędne ceny w multi-store – waluta bazowa i cache reguł cenowych

by Henryk Tews / wtorek, 25 sierpnia 2026 / Opublikowano w Magento / Adobe Commerce

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_price zduplikowane 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.

About Henryk Tews

Co możesz przeczytać następne

Magento 2 wolno się ładuje – problem N+1 i kolekcje bez limitu
Magento 2 REST API działa wolno – brak pageSize i złe filtrowanie
PWA Studio vs Hyvä vs Luma – rzetelne porównanie TCO i kiedy który
  • Publikacje
  • O autorze
  • Kontakt

© 2026 Created by

GÓRA
Zarządzaj zgodą
Aby zapewnić jak najlepsze wrażenia, korzystamy z technologii, takich jak pliki cookie, do przechowywania i/lub uzyskiwania dostępu do informacji o urządzeniu. Zgoda na te technologie pozwoli nam przetwarzać dane, takie jak zachowanie podczas przeglądania lub unikalne identyfikatory na tej stronie. Brak wyrażenia zgody lub wycofanie zgody może niekorzystnie wpłynąć na niektóre cechy i funkcje.
Funkcjonalne Zawsze aktywne
Przechowywanie lub dostęp do danych technicznych jest ściśle konieczny do uzasadnionego celu umożliwienia korzystania z konkretnej usługi wyraźnie żądanej przez subskrybenta lub użytkownika, lub wyłącznie w celu przeprowadzenia transmisji komunikatu przez sieć łączności elektronicznej.
Preferencje
Przechowywanie lub dostęp techniczny jest niezbędny do uzasadnionego celu przechowywania preferencji, o które nie prosi subskrybent lub użytkownik.
Statystyka
Przechowywanie techniczne lub dostęp, który jest używany wyłącznie do celów statystycznych. Przechowywanie techniczne lub dostęp, który jest używany wyłącznie do anonimowych celów statystycznych. Bez wezwania do sądu, dobrowolnego podporządkowania się dostawcy usług internetowych lub dodatkowych zapisów od strony trzeciej, informacje przechowywane lub pobierane wyłącznie w tym celu zwykle nie mogą być wykorzystywane do identyfikacji użytkownika.
Marketing
Przechowywanie lub dostęp techniczny jest wymagany do tworzenia profili użytkowników w celu wysyłania reklam lub śledzenia użytkownika na stronie internetowej lub na kilku stronach internetowych w podobnych celach marketingowych.
  • Zarządzaj opcjami
  • Zarządzaj serwisami
  • Zarządzaj {vendor_count} dostawcami
  • Przeczytaj więcej o tych celach
Zobacz preferencje
  • {title}
  • {title}
  • {title}