Afișarea denumirii și adresa locker-ului EasyBox folosind modulul oficial SameDay pentru WooCommerce

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.).

Clarificări

Clarificări

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.