Интегриране на custom статистика в WordPress с разширение WooCommerce

TNTM

Member
Здравейте,

Имаме е-магазин, базиран на WordPress с инсталирано разширение WooCommerce. За да следя трафика реших да използвам система за проследяване на посещенията в реално време, която съм писал през 2008-2009 за друг проект. След неизбежната актуализация на кода и привеждането му в съответствие с изискванията на PHP7 възникна въпросът, как да интегрирам кода на статистиката в WordPress.

Не познавам ядрото на WordPress, нито разполагам с възможност тепърва да го разучавам и затова се спрях на две възможни решения за извикването на проследяващия скрипт:

1) Включване в изходния код на страницата като изображение, посредством <IMG>-таг;

2) Включване в изходния код на страницата чрез JavaScript.

При включване в HTML-кода губя заглавките (хедъра за заявката), с която е извикана страницата, тъй като към момента на зареждане на изображението, съвсем логично те вече са били изпратени от браузъра. Т.е. стойността за HTTP_REFERER в глобалния масив $_SERVER[] за скрипта, създаващ изображението, ще е адресът на вече извиканата страница, в която то следва да се зареди, а не външният адрес, от който е било извършено препращането.

Тогава реших вместо да извиквам скриптовете на статистиката чрез вградено изображение да използвам JavaScript, който да вземе тази стойност от историята на браузъра. За съжаление тази дупка в сигурността поне при основните браузъри се оказа отдавна затворена.

Какъв принцип на интегриране използват външни приложения като Tyxo и Google Analytics, за да получат достъп до стойността на HTTP_REFERER за съответната страница, в която са вградени?


3) Третото решение, което ми минава през ума би представлявало действителна интеграция. То предполага да намеря тази част от конструктора на WordPress, в която се инициализира сесията, посредством функцията session_start(); и да създам елемент в сесийния масив със стойността на HTTP_REFERER, който скриптовете на статистиката биха могли спокойно да обработят. Въпросът е, в кой файл се намира сесийният конструктор на WordPress и къде в кода бива извикван?

Не на последно място, колко практично би било решение (3) с оглед регулярните ъпдейти на WordPress?

Какво решение за интегриране на скриптовете на статистиката бихте ми препоръчали?

И сайтът, и статистиката се намират на един и същ сървър.
 
То предполага да намеря тази част от конструктора на WordPress, в която се инициализира сесията, посредством функцията session_start(); и да създам елемент в сесийния масив със стойността на HTTP_REFERER, който скриптовете на статистиката биха могли спокойно да обработят.
Не е добра идея. WP по идея е stateless и използването на сесии ще вземе да потвърди градските легенди на "гурутата" колко е бавен.

Не на последно място, колко практично би било решение (3) с оглед регулярните ъпдейти на WordPress?
С това нямаш никакъв проблем, правиш си един плъгин, закачаш се на init hook-a и от там си викаш скриптовете. Ще ти се наложи да филтрираш всякакви вътрешни бози от сорта на w-cron и ajax заявки.

Проблемът с тази схема е, че всяко кеширане я прави неработоспособна.

Тогава реших вместо да извиквам скриптовете на статистиката чрез вградено изображение да използвам JavaScript, който да вземе тази стойност от историята на браузъра. За съжаление тази дупка в сигурността поне при основните браузъри се оказа отдавна затворена.
Използвай document.referrer
 
Torbalan Trolski,

Минах и през document.referrer докато търсех JavaScript-решения без да съобразя, че под Windows с всички ограничения за област на действие, които бяха наложени върху изпълнението на JavaScript, няма как да ми върне път. Пробвах го на виртуалния сървър и резултатът цъфна :)

Благодаря, че отново ме върна към това свойство!

Сега остава да помисля, как най-ефективно да предам стойността на HTTP_REFERER към скриптовете на статистиката. Тази стойност ще ми е нужна само при първо зареждане на страница от сайта, за да видя препращащия адрес, ако има такъв. От там насетне ще следя потребителя по-ефективно с възможностите на сървъра.

Въпросът е, как да предам тази стойност, а от това ще зависи и самото включване на статистиката:

1) Асинхронна заявка към сървъра (AJAX):

При първо зареждане предава стойността на HTTP_REFERER чрез асинхронна GET-заявка, от там насетне заявката ще служи само, за да извиква PHP скрипта на статистиката - лесно за управление, но вероятно ще товари излишно.

2) Предаване като GET-параметър в адреса на изображението, което извиква статистиката:

JavaScript-а взема стойността на HTTP_REFERER и я дописва динамично като query string към URL-адреса на вграденото в <IMG>-таг изображение, извикващо статистиката. Тук ме притеснява синхронизацията - изображението вероятно ще е заредено преди браузъра да стигне до JavaScripta, а това значи да викам статистиката 2 пъти, което не е рационално. Ако първо се изпълни JavaScripta, а браузъра не е стигнал до IMG-тага, ще възникне добре познатата грешка: undefined object - слаб вариант.

3) Динамично генериран <IMG>-таг от самия JavaScript

Вариация на (2) с тази разлика, че <IMG>-тага не се вгражда в кода, а се създава от JavaScript-а динамично чрез метода innerHTML. Може и направо да се зададе нова стойност за <IMG>-тага - на първо четене ми изглежда възможно решение.

4) Предаване чрез Cookie, извикване на статистиката чрез вградено изображение

JavaScript-а изпраща Cookie със стойността на HTTP_REFERER, което PHP скрипта на статистиката обработва и изчита щом бъде извикан, а самото извикване отново да става чрез <IMG>-таг и изображение. JavaScript-а ще бъде разположен в хедъра на документа и Cookie-то със сигурност ще бъде генерирано преди да се зареди изображението, извикващо статистиката - изглежда ми най-удачният вариант, евентуално в комбинация с (3).

Пропускам ли нещо?


slavchev,

Не обичам да използвам готови решения. Все пак ти благодаря за вниманието към темата!
 
При вграждане на статистиката с <IMG>-таг или JavaScript изпускам ботовете :(

Някакво решение?

* * *

Явно опираме до include() на скрипта, събиращ данните за статистиката. Къде в ядрото на WordPress би било най-удачно да направя включването, за да съм сигурен, че кодът ще се зарежда винаги, когато се извиква дадена страница от потребителската секция на WordPress и не по-малко важно - че хедърите не са вече изпратени, за да мога да манипулирам спокойно със сесии и Cookie-та?
 
Последно редактирано:

Горе