Wdrożenie Omnibusa w sklepie na WooCommerce (kurs)

Koleżanka w swoim sklepie (WooCommerce) postanowiła wdrożyć promocję, a konkretnie promocyjne pakiety produktów. Kupując taki pakiet, klient płaci mniej, niż gdyby kupił oddzielnie wszystkie produkty, a do tego dołożył do pakietu jeszcze produkt, którego inaczej niż w tym właśnie pakiecie nie da się kupić. Brzmi sensownie. Pojawił się jednak mały problem, gdy użytkownik, który z landinga (strona lądowania, promocyjna pakietu) kliknął link przenoszący do sklepu, który od razu dodawał ów pakiet do koszyka miał już któryś z produktów wchodzących w skład pakietu w koszyku.

Czyszczenie koszyka za pomocą linku w WooCommerce

W wielu sklepach, a konkretnie branżach nie byłoby to problem, ale w przypadku sklepu koleżanki, gdzie w większości sprzedaje kursy internetowe, praktycznie wszystkie produkty mają wyłączoną możliwość dodawania kilku sztuk tego samego produktu do koszyka. Bo w większości przypadków nie miałoby to sensu (tak samo, jak ponownego zakupu już wcześniej zakupionego produktu).

I tak koleżanka trafiła do mnie z zapytaniem, czy dałoby się zrobić tak, że gdy ktoś „wejdzie do sklepu” z takim linkiem, to przed dodaniem pakietu do koszyka tenże koszyk zostałby wyczyszczony.

Tak więc weźmy przykładowy link, z jakiego można skorzystać, by od razu odpowiedni produkt wskoczył do koszyka LINK?:

https://sklep.webinsider.pl?add-to-cart=60

Powyższy link doda do koszyka produkt o identyfikatorze (ID) 60. Można go lekko zmodyfikować, tak by od razu – jeśli w sklepie nie ma takiej opcji aktywnej domyślnie – przenieść użytkownika do koszyka (lub innej strony, jeśli jest taka potrzeba):

https://sklep.webinsider.pl/koszyk/?add-to-cart=60

Powyższe 2 linki zadziałają w (praktycznie) każdym sklepie na WooCommerce, bo jest to standardowa opcja.

Funkcja czyszcząca koszyk za pomocą argumentu w linku

Opróżnianie koszyka na podstawie linku trzeba już dodać (a sam koszyk chodzi za użytkownikiem na różnych urządzeniach ;-)), i można to zrobić np. za pomocą takiego kodu, który wystarczy dodać np. do pliku functions.php motywu potomnego:

function webinsider_wp_wc_empty_cart_url() {
	if ( isset( $_GET['empty-cart'] ) ) {
		WC()->cart->empty_cart();
	}
}
add_action( 'init', 'webinsider_wp_wc_empty_cart_url' );

W tym momencie, by za pomocą linku opróżnić koszyk, wystarczy w linku wystarczy wstawić argument „empty-cart”:

https://sklep.webinsider.pl?empty-cart

W wersji z dodawaniem wybranego produktu do koszyka link będzie wyglądał np. tak:

https://sklep.webinsider.pl?empty-cart&add-to-cart=60

A tak, z przejściem do wybranej strony, np. koszyka:

https://sklep.webinsider.pl/koszyk/?empty-cart&add-to-cart=60

Oczywiście, gdyby to miała być inna strona docelowa niż „koszyk”, to w powyższym linku należy ją wstawić zamiast „koszyk” (tak samo, jak trzeba podstawić własny adres sklepu ;-)).

Czyszczenie koszyka i usuwanie argumentu z adresu URL

Ale możemy pójść o krok dalej, i po wyczyszczeniu koszyka usunąć „czyszczący argument” z linku. W tym celu należy lekko zmodyfikować:

function webinsider_wp_wc_empty_cart_url() {
	if ( isset( $_GET['empty-cart'] ) ) {
		WC()->cart->empty_cart();
		
		$referer = wp_get_referer();
		$referer = remove_query_arg( 'empty-cart' );
		wp_safe_redirect( $referer );
	}
}
add_action( 'init', 'webinsider_wp_wc_empty_cart_url' );

W tym momencie argument „empty-card” zostanie usunięty z adresu. I tak adres strony (URL), np. taki:

https://sklep.webinsider.pl?empty-cart&add-to-cart=60

zmieni się na:

https://sklep.webinsider.pl?add-to-cart=60

Co może mieć znaczenie nie tylko wizualne…

Automatyczne przenoszenie do koszyka, gdy jest produkt do dodania

Ale kod możemy zmodyfikować jeszcze trochę, np. dodając automatyczne przenoszenie do koszyka, gdy oprócz argumentu wywołującego czyszczenie koszyka (empty-cart) w adresie znajdzie się argument odpowiedzialny za dodanie produktu do koszyka (add-to-cart):

function webinsider_wp_wc_empty_cart_url() {
	if ( isset( $_GET['empty-cart'] ) ) {
		WC()->cart->empty_cart();
		
		if ( isset( $_GET['add-to-cart'] ) ) {
			$referer = wc_get_cart_url();
		} else {
			$referer = wp_get_referer();
			$referer = remove_query_arg( 'empty-cart' );
		}
		# Redirect
		wp_safe_redirect( $referer );
	}
}
add_action( 'init', 'webinsider_wp_wc_empty_cart_url' );

W tym momencie z adresu nie tylko zostanie usunięty argument „empty-card”, ale i inne (w tym i „add-to-cart”), bo nastąpi przekierowanie do koszyka. I tak adres strony (URL), np. taki:

https://sklep.webinsider.pl?empty-cart&add-to-cart=60

zmieni się na:

https://sklep.webinsider.pl/koszyk/

W przypadku gdy link nie będzie zawierał argumentu dodającego produkt do koszyka (add-to-cart) z adresu zostanie „tylko” usunięty argument „empty-cart”.

Całość można rozbudować jeszcze, choćby o warunek sprawdzający, czy wp_get_referer() cokolwiek (sensownego) zwraca (tak dla zasady ;-)), ale… to już każdy we własnym zakresie. Nawet niekoniecznie jako praca domowa… ;-)

(!) Zgłoś błąd na stronie
Pomogłem? To może postawisz mi wirtualną kawę?
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Wdrożenie Omnibusa w sklepie na WooCommerce (kurs)
Patryk
Wdrożenie Omnibusa w sklepie na WooCommerce (kurs)