Dacă te-ai întrebat cum poți implementa acordarea de transport gratuit cu titlu promoțional, atunci când un client adaugă în coș un produs marcat anume în acest scop, are să te cuprindă mirarea aflând (dar află oricum) că ai două modalități. Una mai grea, alta mai ușoară.
Mai greu
Calea mai dificilă și (probabil) mai interesantă pentru utilizatorii care știu un pic de programare și, eventual, pentru programatorii care știu un pic de programare este să-și scrie singur propriul modul, idee pe care o vom urmări mai jos.
O soluție, probabil nu singura, dar, în orice caz, cea care a funcționat pentru mine și pe care am folosit-o este folosirea noțiunii de clasă de transport disponibilă în WooCommerce pentru a marca produsul sau produsele care acordă favorul de transport gratuit.
Esențialul
Soluția presupune trei lucruri de bază:
- primul, crearea clasei de transport propriu-zise;
- al doilea, pregătirea unui cupon care acordă transport gratuit pentru întregul coș (evident, asta înseamnă că trebuie activată utilizarea cupoanelor);
- al treilea, în sfârșit, este adăugarea automată a cuponului în coș atunci când coșul conține cel puțin un produs special, dar și păzirea coșului de utilizatorii predispuși la agerimi care ar putea-ncerca să adauge codul de mână.
Presupunând că primele două puncte de mai sus au fost acoperite (fie manual, fie automat, printr-o mică rutină de instalare, aspect în care n-o să intrăm), primul lucru este sincronizarea produs-cupon-coș:
- dacă în coș există unul sau mai multe produse marcate cu clasa de transport aleasă, atunci se adaugă automat în coș cuponul de transport gratuit, așa cum am discutat și mai sus;
- dacă din coș sunt scoase produse și, ca urmare a acestor operațiuni, nu mai există niciun produs cu clasa de transport aleasă, atunci este înlăturat și cuponul de transport gratuit.
Pentru exemplificare o să folosesc codul de cupon sample01-free-ship-coupon, codul sample01-free-ship-class pentru clasa de transport și o să presupun că ambele au fost deja create. Acestea fiind spuse și pregătite, ne putem atașa la hook-ul woocommerce_before_cart_table pentru a face verificările și ajustările de care avem nevoie în vederea adăugării/înlăturării cuponului:
function s01_ensure_coupon_synced() {
if (wc_coupons_enabled()) {
$couponCode = 'sample01-free-ship-coupon';
$hasCoupon = in_array($couponCode,
WC()->cart->get_applied_coupons());
$shouldHaveCoupon = s01_free_shipping_valid_for_cart();
if ($shouldHaveCoupon) {
if (!$hasCoupon) {
WC()->cart->apply_coupon($couponCode);
}
} else {
if ($hasCoupon) {
WC()->cart->remove_coupon($couponCode);
}
}
}
}
function s01_free_shipping_valid_for_cart() {
$shouldHaveCoupon = false;
$cartContents = WC()->cart->get_cart();
foreach ($cartContents as $cartItem) {
$productId = $cartItem['product_id'];
if (s01_product_eligible_for_free_shipping($productId)) {
$shouldHaveCoupon = true;
}
}
return $shouldHaveCoupon;
}
function s01_product_eligible_for_free_shipping($productId) {
$shouldHaveCoupon = false;
$product = wc_get_product($productId);
if (!empty($product)) {
$shipClassSlug = $product->get_shipping_class();
if ($shipClassSlug == 'sample01-free-ship-class') {
$shouldHaveCoupon = true;
}
}
return $shouldHaveCoupon;
}
add_action('woocommerce_before_cart_table',
's01_ensure_coupon_synced');
Odată problema principală dată la o parte, următoru lucru de rezolvat este interceptarea procesului de validare a cupoanelor astfel încât să nu permitem adăugarea cuponului special de către clienții mai șugubeți. Să ne atașăm deci, de hook-ul woocommerce_coupon_is_valid, cu o funcție, nu spiritual, nu sufletește:
function s01_free_shipping_coupon_valid($valid,
WC_Coupon $coupon,
WC_Discounts $discounts) {
//Only override validity if it's our coupon code
$override = s01_is_free_ship_coupon($coupon);
if ($valid && $override) {
//function defined above
$valid = s01_free_shipping_valid_for_cart();
}
return $valid;
}
function s01_is_free_ship_coupon(WC_Coupon $coupon) {
$couponCode = 'sample01-free-ship-coupon';
return $coupon->get_code() === $couponCode;
}
add_filter('woocommerce_coupon_is_valid',
's01_free_shipping_coupon_valid',
10,
3);
A, deci tu le pui și carne
Ceea ce, fiindcă, așa cum corespunzător a remarcate filozoful de situație, viața e complexă și are multe aspecte, ne va lăsa cu o ultimă dilemă de rezolvat: nu am vrea să afișăm mesaje nici când cuponul e adăugat sau șters, nici când rutina de validare îl respinge.
Motivația ar fi faptul că, în ceea ce-l privește pe utilizator, oricum, acest cupon special nici nu există; este un simplu detaliu al implementării alese de noi pe care ar trebui să ne străduim să-l facem cât mai opac.
Deci, în primul rând, să ne folosim de hook-ul woocommerce_coupon_message pentru suprimarea mesajului de adăugare/ștergere:
function s01_filter_coupon_message($message,
$messageCode,
WC_Coupon $coupon) {
if (s01_is_free_ship_coupon($coupon)) {
$message = null;
}
return $message;
}
add_filter('woocommerce_coupon_message',
's01_filter_coupon_message',
10,
3);
Apoi, în final, de hook-ul woocommerce_coupon_error pentru a suprascrie mesajul de eroare:
function s01_filter_coupon_error_message($error,
$errorCode,
WC_Coupon $coupon) {
if (s01_is_free_ship_coupon($coupon)) {
$error = null;
}
return $error;
}
add_filter('woocommerce_coupon_error',
's01_filter_coupon_error_message',
10,
3);
Mai ușor
Varianta mai ușoară este utilizarea metodei bancnotei de 25$: dai 25$ (fara TVA) și primești un modul care face asta. Și, dacă ai noroc, e lună plină, s-au aliniat planetele și nu e variantă nouă, chiar o să funcționeze.