Envato Elements - pobierasz co chcesz, ile chcesz

Pisząc dziś artykuł o błędzie przy tworzeniu kopii zapasowej w BackWPup „najpewniej” z winy Facebooka, a konkretnie jego wtyczki do WordPressa, wspomniałem, że „dziś jeszcze na naszych łamach zagości kolejna wtyczka z tej stadni, tym razem do WooCommerce, bo wczoraj na prośbę pewnej koleżanki i tą wtyczką się zająć musiałem”. Słowo się rzekło, a więc bierzemy na warsztat wtyczkę Facebook for WooCommerce i błąd, jaki generuje ona w… Facebooku, i według… Facebooka.

Facebook for WooCommerce i (potencjalnie) błędna wartość zdarzenia

Koleżanka w swoim sklepie uznała, że skoro startuje z płatną promocją swojego sklepu na Facebooku, to dobrze nie tylko mieć zainstalowany piksel Facebooka, ale również odpowiednio ustawić konwersje, tak by łatwiej określić czy dana reklama się opłaca. W tym celu zainstalowała i skonfigurowała w swoim sklepie wtyczkę Facebook for WooCommerce, co właściwie miało być końcem działań w tym zakresie, przynajmniej po stronie sklepu.

Jak się szybko okazało, wtyczka faktycznie odpowiednie kody do strony sklepu dodawała, ale Facebook twierdził, że coś jest nie tak. Coś nie tak ze zdarzeniami związanymi z dodawaniem do koszyka, czy jakoś tak:

Szczegóły błędu koleżance też niewiele pomogły, bo choć można było już na tym etapie przypuszczać, co może być nie tak, to co z tym zrobić to inna kwestia:

I tu wkraczam ja, cały na… czarno. Przynajmniej jeśli nie liczyć niebieskich dżinsów… ;-)

Uzbrojony w powyższe zrzuty ekranu zaglądam do kodu źródłowego strony składania zamówienia i szukam wspomnianego w opisie „content_ids”, co wygląda np. tak:

<script type="text/javascript">
jQuery(function($) { 
	
	fbq('set', 'agent', 'woocommerce-4.9.2-2.2.0', '5483265120369520');
	fbq('track', 'InitiateCheckout', {
		"source": "woocommerce",
		"version": "4.9.2",
		"pluginVersion": "2.2.0",
		"num_items": 1,
		"content_ids": "[\"wc_post_id_12345\"]",
		"content_name": "[\"Produkt testowy 01\"]",
		"content_type": "product",
		"contents": "[{\"id\":\"wc_post_id_12345\",\"quantity\":1}]",
		"value": "98.90",
		"currency": "PLN"
	}, {
		"eventID": "02485b71-36c3-5e88-ca1e-353c41fbcdad"
	});
});
</script>

Pierwsza myśl – skoro czepia się „content_ids”, a do tego mamy tam potworki w stylu „wc_post_id_12345”, to spróbujmy pozbyć się „wc_post_id_” i zobaczymy, czy będzie dobrze.

Odszukałem odpowiedni plik we wtyczce Facebook for WooCommerce:

/var/www/webinsider.pl/wp-content/plugins/facebook-for-woocommerce/includes/fbutils.php

i zmieniłem linijkę 24. z:

const FB_RETAILER_ID_PREFIX = 'wc_post_id_';

na:

const FB_RETAILER_ID_PREFIX = '';

Po tej operacji jeszcze raz zajrzałem do źródła strony, by się upewnić, czy to na pewno (tylko) to miejsce:

<script type="text/javascript">
jQuery(function($) { 
	
	fbq('set', 'agent', 'woocommerce-4.9.2-2.2.0', '5483265120369520');
	fbq('track', 'InitiateCheckout', {
		"source": "woocommerce",
		"version": "4.9.2",
		"pluginVersion": "2.2.0",
		"num_items": 1,
		"content_ids": "[\"12345\"]",
		"content_name": "[\"Produkt testowy 01\"]",
		"content_type": "product",
		"contents": "[{\"id\":\"12345\",\"quantity\":1}]",
		"value": "98.90",
		"currency": "PLN"
	}, {
		"eventID": "02485b71-36c3-5e88-ca1e-353c41fbcdad"
	});
});
</script>

Wyglądało dobrze, więc zostało potwierdzić w samym Facebooku:

I choć się zastanawiam, czy nie lepiej dobrać się do linijki odpowiedzialnej za konstrukcję „content_ids”, ale skoro koleżanka twierdzi, że po tej zmianie wszystko działa prawidłowo, co zresztą widać też na zrzucie, to pewnie tak jest. Bo ja to się tak na tym Facebooku znam tylko tyle, ile muszę, tylko tyle, by czasem przystrzyc owieczki… ;-)

Skrypt do automatycznej podmianki

Problem rozwiązany, ale nie ma pewności, czy przy kolejnej aktualizacji zostanie naprawiony ten błąd. Ba, nie mam nawet pewności, czy to faktycznie błąd, czy jednak z jakichś względów właśnie tak nie musi być.

Stąd uznałem, że skoro koleżanka twierdzi, że po tej modyfikacji wszystko jest tak, jak potrzebuje, to postanowiłem jej dodać małe polecenie do systemowego harmonogramu zadań (CRON), które będzie w razie potrzeby podmieniać oryginalną linijkę na zmodyfikowaną.

W tym celu postanowiłem skorzystać z polecenia „replace”, instalowanego wraz z MySQL:

sudo replace "const FB_RETAILER_ID_PREFIX = 'wc_post_id_';" "const FB_RETAILER_ID_PREFIX = '';" -- /var/www/webinsider.pl/wp-content/plugins/facebook-for-woocommerce/includes/fbutils.php

W wersji dla harmonogramu (CRONa) będzie wyglądało tak:

# Facebook for WooCommerce: Remove wc_post_id_ from FB_RETAILER_ID_PREFIX (content_ids)
*/5 * * * * root replace "const FB_RETAILER_ID_PREFIX = 'wc_post_id_';" "const FB_RETAILER_ID_PREFIX = '';" -- /var/www/webinsider.pl/wp-content/plugins/facebook-for-woocommerce/includes/fbutils.php >/dev/null 2>&1

Odpalane regularnie co 5 minut, choć czas ten można dostosować do swoich potrzeb…

W powyższym przykładzie korzystam z komendy „replace”, która niebawem przestanie być wspierana (MySQl 8+):

Warning: replace is deprecated and will be removed in a future version.

The replace utility is deprecated as of MySQL 5.7.18 and is removed in MySQL 8.0.

Ale póki jest, to korzystam, zwłaszcza że pracuje mi się z nią wygodniej niż… No i już widać, że nie tylko mi, bo powstały już alternatywne rozwiązania, pozwalające „przywrócić” tę komendę/polecenie do systemu.

Oficjalna wtyczka Facebooka

W całej tej historii zdziwiło mnie najbardziej to, że wtyczka, o której mowa, czyli Facebook for WooCommerce to oficjalna wtyczka Facebooka, w więc co jak co, ale ta jak żadna inna powinna być zgodna z wymaganiami Facebooka. A tymczasem jest, jak jest.

Z tym że jak pisałem – w mojej drużynie od Facebooka jest kto inny, więc być może ten błąd to jednak nie błąd, a funkcjonalność… ;-)

(!) Zgłoś błąd na stronie

Zapraszam do naszego Newslettera - ZERO SPAMu, same konkrety, oraz dostęp do dodatkowych materiałów przeznaczonych dla subskrybentów!