Polylang: pll_e() și pll__() în functions.php nu funcționează
Am în functions.php câteva funcții care afișează blocuri de HTML. Problema apare cu pluginul Polylang, care utilizează funcțiile personalizate pll_e() și pll__().
Acestea funcționează corect în index.php în orice temă, dar nu funcționează corespunzător în functions.php, care practic întotdeauna îmi returnează șirurile din limba implicită, chiar dacă acestea sunt înregistrate în administrare.
Deci, acele blocuri afișate în index.php folosind funcțiile pll_, funcționează bine. Dar aceleași blocuri afișate în functions.php, apar întotdeauna în engleză.
Am postat acest lucru pe forumul oficial de suport al pluginului. Încă nu am primit răspuns.
Are cineva de aici vreo idee despre ce ar putea fi?
Vă mulțumesc mult!

Nu am experiență cu pluginul Polylang, dar cred că este sigur să presupunem că acest lucru are legătură cu ordinea de încărcare a pluginului Polylang și fișierul functions.php
al temei tale. Când apelezi o funcție în scope-ul global (adică nu din interiorul unei alte funcții) din index.php
sau orice alt fișier de template, aceasta va fi executată într-o etapă târzie a procesului de încărcare a paginii, după ce WordPress a fost complet inițializat și chiar după ce serverul a început să trimită răspunsul către client.
O funcție apelată din scope-ul global al fișierului functions.php
, însă, va fi executată într-un moment mult mai devreme. În timpul unei încărcări tipice a unei pagini, ceea ce se întâmplă în esență este că mai întâi WordPress se configurează, apoi încarcă pluginurile și în final tema. Totuși, acest proces nu este atât de liniar pe cât ai putea crede, deoarece unele pluginuri ar putea depinde de funcționalități care ar putea să nu fie disponibile până când WordPress nu este complet inițializat, tema este încărcată sau răspunsul paginii a început să fie trimis. WordPress rezolvă acest lucru folosind hook-uri, care permit unui plugin sau unei teme să execute cod în anumite etape ale procesului de încărcare.
Pentru a face un răspuns lung scurt și mai lung, ceea ce trebuie să faci este să te asiguri că nu apelezi pll_e()
sau pll__()
până când nu ești sigur că pluginul Polylang este pregătit. Acest lucru poate fi determinat prin analizarea codului sursă (sau poate din documentație), dar presupun că folosirea hook-ului init
va fi suficientă. Funcțiile apelate în scope-ul global al functions.php
vor fi executate înainte de hook-ul init
, dar prin adăugarea unui hook init
poți face ca o funcție să ruleze într-o etapă ulterioară. Iată cum:
function my_setup() {
global $some_var;
$some_var = pll__('Un șir care necesită localizare', 'localization_domain'); // Aceasta presupune că această funcție se comportă similar cu __()
pll_e("Vom afișa pur și simplu acest lucru, undeva", 'localization_domain');
}
add_action('init', 'my_setup');

Ce ai încercat? Ai folosit alt hook în loc de init
? De asemenea, sper că nu ai copiat/lipeșt pur și simplu codul meu, pentru că era o eroare în el. :)

M-am uitat la Polylang și pll__($string)
este doar un wrapper peste __($string, 'pll_string')
care este integrat în WordPress. Totuși, plugin-ul adaugă filtre la override_load_textdomain
, gettext
și gettext_with_context
. De asemenea, încarcă propriul textdomain pe hook-urile wp
, login_init
, admin_init
, așa că probabil funcțiile ar fi disponibile după oricare dintre acestea. De asemenea, după ce setup-ul este complet, se declanșează pll_language_defined
, care ar putea fi de asemenea demn de luat în considerare. În general, cel mai bun sfat este să te uiți la codul sursă al Polylang pentru a înțelege cum funcționează.
