Kodėl „Jetpack“ ir „WP-Filebase“ įskiepiai neveikia kartu?

Aktyvavus „Jetpack“ įskiepį „WP-Filebase“ į įrašą automatiškai įterpiamas parsisiuntimo mygtukas tiesiog pranyksta. Kodėl?

Linas Rupeika

Tai yra klasikinis pavyzdys, kaip dviejų įskiepių autoriai nepagalvoja apie tai, kad realybėje svetainės naudoja daugiau nei vieną įskiepį. Iš esmės problemą kelia tik vienas ar du „Jetpack“ įskiepio moduliai – „Publicize“ ir galbūt „Sharing“. Šiuos du modulius deaktyvavus, „WP-Filebase“ vėl veikia korektiškai.

Po ilgo ir nuobodaus landžiojimo po įskiepių kodą pagaliau pavyko identifikuoti problemą – „WP-filebase“ naudoja labai kvailą būdą atpažinti, ar tam tikra funkcija nebuvo panaudota kelis kartus – globalų kintamąjį, taip vadinamą vėliavėlę. O „Jetpack Publicize“ tą funkciją iškviečia generuodamas jam reikalingą meta informaciją wp_head vykdymo metu. „Jetpack“ intencijos šiuo atveju – visiškai nekaltos ir natūralios  – jei tiesiog naudojasi standartiniais WordPress metodais atlikti jiems reikalingą darbą. O „WP-filebase“ atrodo, kad mygtuką jis jau įterpė ir nieko daryti nebereikia.

Tapo aišku, kad problemos sprendimui reikia įvesti papildomą tikrinimą /wp-filebase/class/Core.php faile, ContentFilter metode. Pirmas bandymas buvo patikrinti, ar veiksmas vyksta pagrindiniame loop’e (naudojant is_main_loop() funkciją), bet kažkodėl „Jetpack“ vykdomas kodas irgi apsimetinėja pagrindiniu loop’u, taigi šis metodas neveikia. Tuomet išbandžiau naują, 3.9 versijoje pristatytą funkciją – doing_action($action) – ji patikrina ar WordPress šiuo metu vykdo tam tikrą veiksmą (mūsų atveju – wp_head). Taigi, sprendimas yra toks – ties maždaug 216-217 eilute, ContentFilter metodo pradžioje įterpti vieną papildomą eilutę (10 eil pavyzdyje).