Tworzenie dynamicznie odświeżanych informacji o koszyku WooCommerce

WooCommerce znacząco upraszcza proces pobierania aktualnych informacji o stanie koszyka z użyciem zapytań AJAX-owych. Dzięki filtrowi woocommerce_header_add_to_cart_fragment możemy stworzyć dynamicznie odświeżane fragmenty strony, bez konieczności pisania linijki kodu JavaScript.

Jak to działa?

Rozwiązanie naszego problemu jest bardzo proste:

1) Tworzymy element w kodzie motywu, który będzie odświeżany przy każdym kliknięciu przycisku “Dodaj do koszyka”,

2) W filtrze woocommerce_header_add_to_cart_fragment tworzymy kod, który generuje zawartość odświeżanego elementu w taki sam sposób w jaki jest generowany element w motywie,

3) W tej samej funkcji modyfikujemy tablicę $fragments, gdzie klucz to selektor naszego elementu.

Dzięki powyższemu rozwiązaniu korzystamy z mechanizmu, który przy każdym kliknięciu przycisku “Dodaj do koszyka” odświeża zawartość wszystkich elementów zdefiniowanych w tablicy $fragments.

Takie podejście pozwala nam ominąć etap pisania kodu JavaScript, gdyż wszystko co jest nam potrzebne zostało już wcześniej napisane przez autorów wtyczki WooCommerce.

Kod dla motywu

W wybranym miejscu naszego motywu umieszczamy element, który będzie służył za element wyświetlający informacje z koszyka:

<span class="theme-slug-cart-info">
    <?php 
        echo sprintf(
            _n( 
                'Masz  w koszyku %d produkt (%s)', 'Masz w koszyku %d produktów (%s)', 
                WC()->cart->cart_contents_count,
                'slug_theme'
            ), 
            WC()->cart->cart_contents_count, 
            WC()->cart->get_cart_total()
        ); 
    ?>
</span>

Kod filtra

W pliku functions.php naszego motywu musimy dodać następujący fragment:

if(!function_exists('theme_slug_dynamic_fragment')) :
    function theme_slug_dynamic_fragment($fragments) {
        $output = '';
        $output .= '<span class="cart-info">';
        $output .= sprintf(
            _n( 
                'Masz  w koszyku %d produkt (%s)', 'Masz w koszyku %d produktów (%s)', 
                WC()->cart->cart_contents_count,
                'slug_theme'
            ), 
            WC()->cart->cart_contents_count, 
            WC()->cart->get_cart_total()
        ); 
        $output .= '</span>';

        $fragments['.theme-slug-cart-info'] = $output;

        return $fragments;
    }

    add_filter('woocommerce_add_to_cart_fragments', 'theme_slug_dynamic_fragment');
endif;

Funkcja obsługująca filtr woocommerce_add_to_cart_fragments jako argument przyjmuje tablicę w której kluczami są selektory elementów odświeżanych przy każdym dodaniu elementu do koszyka a wartościami są zmodyfikowane zawartości tych elementów.

W naszej funkcji theme_slug_dynamic_fragment tworzymy kod, który generuje ten sam fragment strony jak kod po stronie motywu a cały wygenerowany kod zapisujemy do zmiennej. Zawartości tej zmiennej następnie umieszczamy w tablicy fragmentów pod kluczem z selektorem CSS naszego elementu.

Na koniec zwracana jest zmodyfikowana tablica fragmentów.

Ważne: Warto zadbać o to by selektor elementu był możliwie unikalny – dzięki temu unikniemy sytuacji w której nasz kod nadpisuje kod innego elementu generowanego przez motyw/wtyczkę.

Podsumowanie

Jak widać WooCommerce znacząco upraszcza proces obsługi odświeżania elementów związanych z koszykiem poprzez AJAX. Mechanizm ten można wykorzystać na wiele sposób, nie tylko do pokazywania informacji o koszyku.

Możemy też przykładowo:

1) Pokazywać informację dla użytkownika po przekroczeniu odpowiedniej liczby produktów w koszyku,

2) Wyświetlać produkty powiązane z ostatnio dodanym produktem (szczególnie przydatne gdy produkt dodawany jest do koszyka na stronie z wieloma produktami),

3) Wyświetlać wiadomość dopiero po dodaniu produktu do koszyka np. z przekierowaniem do strony z dodatkowymi informacjami o danym produkcie.

Ekskluzywne porady, triki i trendy bezpośrednio na Twoją skrzynkę odbiorczą. Adres e-mail

[shopmagic_form id="3782" name=false labels=false doubleOptin]

Ekskluzywne porady, triki i trendy bezpośrednio na Twoją skrzynkę odbiorczą. Adres e-mail

[shopmagic_form id="3782" name=false labels=false doubleOptin]