Cum să interceptez înainte de W3 Total Cache în WordPress
Scriu un plugin în care vreau să citesc user agent-ul și să trimit headere personalizate înapoi pentru anumiți agenți. Din păcate, mulți utilizatori au plugin-ul W3 Total Cache instalat, iar ceea ce se întâmplă este că, atunci când am o condiție care trimite înapoi header-ul personalizat, acesta este trimis pentru TOȚI user agent-ii, fără a rula logica evenimentului meu. Am încercat să încarc evenimentul meu cu...
add_action('plugins_loaded','MY_PLUGIN::checkRules',-1000000000);
...dar W3 Total Cache interceptează prin .htaccess sau prin alt mecanism. Din păcate, trebuie să o fac la nivelul plugins_loaded
pentru că am nevoie să interoghez get_option
.
Cum pot face ca plugin-ul meu să funcționeze chiar dacă W3 Total Cache este activ?

Dacă caching-ul este activat la nivelul fișierului .htaccess
, nu prea ai ce face prin intermediul unui plugin pentru a intercepta acest trafic. În schimb, ar trebui să stabilești un set de reguli recomandate pentru .htaccess
care să funcționeze atât cu W3TC cât și cu pluginul tău, pentru a permite fie trecerea traficului, fie returnarea conținutului din cache.
Poate ar fi bine să generezi automat o listă de agenți utilizatori (user agents) pentru care dorești să trimiți headere personalizate și să folosești acea listă—prin .htaccess
—pentru a permite anumitor tipuri de trafic să ocolească cache-ul.

Am găsit soluția. Va trebui să folosești versiunea W3TC 0.9.2.4 sau mai nouă, deoarece asta am folosit când am testat modificările mele în cod. A trebuit să editez codul plugin-ului meu și să găsesc orice loc în care verificam agenții utilizator (user agents) și returnam un răspuns. Chiar înainte de a returna un răspuns negativ (cum ar fi 404 sau 403 - orice a setat utilizatorul în setările plugin-ului), a trebuit să adaug această linie:
define('DONOTCACHEPAGE', true);
De asemenea, este important de menționat că modul în care verificam agenții utilizator era prin apelarea unei funcții via un eveniment WordPress care se afla destul de sus în lanțul de evenimente:
add_action('plugins_loaded','MYPLUGIN::checkAgents',-1000000000);
Acest add_action() este important deoarece trebuie să fie sus în lanț, încărcându-se înainte de încărcarea plugin-ului W3TC. De aceea am folosit un număr de prioritate negativ.
