Pe lângă problema cu netrimiterea datelor locker-ului EasyBox ales, mai este loc de o îmbunătățire a ergonomiei modulului SameDay pentru WooCommerce: afișarea informațiilor locker-ului ales (nume și adresa) atunci când se afișează detaliile comenzii (în e-mail-ul de confirmare, panoul de administrare, contul de client etc.).
Motivele sunt evidente, așa că o să trec direct la descrierea soluției, adăugând doar că premisele de la care plec sunt:
– că oriunde este afișata metoda de transport asociată unei comenzi trebuie să fie afișate și aceste informații;
– că există doar o metodă de transport pentru o comandă.
Poate nu este cazul pentru oricine, dar de asta am avut nevoie și asta am implementat. Așadar, soluția are trei pași de rezolvat:
– atașarea de un punct oficial de extensie pentru a modifica denumirea metodei de transport;
– extragerea informațiilor legate de locker-ul ales (aici depindem direct de structura datelor folosite de modulul SameDay);
– dacă se modifică structura datelor folosite de acel modul, trebuie pur și simplu să nu mai fie afișate informațiile suplimentare, nu să crape cu zgomot.
Punctul de extensie pe care l-am ales a fost filtrul cu nume dinamic woocommerce_order_item_get_[prop_name]. Pentru denumirea metodei de transport, numele proprietății este method_title, deci numele filtrului este: woocommerce_order_item_get_method_title.
Acesta este apelat atunci când este invocată funcția WC_Order_Item_Shipping::get_method_title() sau funcția WC_Order_Item_Shipping::get_prop(‘method_title’) și primește doi parametri:
– valoarea curentă a denumirii metodei de transport,
– respectiv item-ul din comandă pentru care a fost făcut apelul.
Ca măsură de siguranță, a trebuit să mă asigur că item-ul primit ca parametru este de tip WC_Order_Item_Shipping, pentru a preveni situațiile când o proprietate cu nume identic este citită dintr-un item de alt tip.
Astfel:
function myc_add_locker_data_to_method_title($previousValue,
$item) {
$value = $previousValue;
if ($item instanceof WC_Order_Item_Shipping) {
$lockerData = _myc_extract_locker_data($item);
if (!empty($lockerData)) {
$value = _myc_add_locker_data_to_method_title($value,
$lockerData);
}
}
return $value;
}
add_filter('woocommerce_order_item_get_method_title',
'myc_add_locker_data_to_method_title'
99999,
2);
Mai departe, pentru extragerea informațiilor locker-ului, am folosit meta-câmpul _sameday_shipping_locker_id, pe care modulul SameDay îl adaugă fiecărei comenzi. Personal, cred că ar fi trebuit asociat cu item-ul care reprezintă metoda de transport, dar, în fine, important e că există. Valoarea este un text JSON, iar proprietățile de care am avut nevoie sunt:
– name, pentru nume;
– address, pentru adresă.
La fiecare pas am făcut verificări, pentru a mă asigura că, dacă se schimbă structura, în orice punct, atunci pur și simplu informațiile nu sunt adăugate, ceea ce ne aduce la definirea celor două funcții folosite mai sus:
function _myc_extract_locker_data(WC_Order_Item $item) {
$lockerData = null;
$order = $item->get_order();
$lockerDataJson = $order->get_meta('_sameday_shipping_locker_id',
true);
if (!empty($lockerDataJson)) {
$lockerData = @json_decode($lockerDataJson,
false);
}
return $lockerData;
}
function _myc_add_locker_data_to_method_title($methodTitle,
stdClass $lockerData) {
if (!empty($lockerData->name)) {
$addName = ucfirst($lockerData->name);
if (!empty($lockerData->address)) {
$addName .= ', ' . ucfirst($lockerData->address);
}
$methodTitle = $methodTitle . ' (' . $addName . ')';
}
return $methodTitle;
}
Cam atât: codul poate fi plasat într-un modul separat sau într-un modul existent.