În ce ordine încarcă WordPress fișierele plugin-urilor?
În ce ordine sunt încărcate plugin-urile în WordPress?
Și în cadrul unui folder specific al unui plugin, ce ordine este urmată pentru încărcare?

Răspuns la prima întrebare:
În
wp-settings.php
, WordPress verifică mai întâi dacă există pluginuri must-use (pluginuri în folderul opționalmu-plugins
) și le încarcă pe acelea.Apoi, dacă rulează o instalație multisite, verifică pluginurile activate la nivel de rețea și le încarcă pe acelea.
Apoi verifică toate celelalte pluginuri active căutând înregistrarea
active_plugins
din tabelul de bază de datewp_options
și parcurge acele pluginuri. Pluginurile vor fi listate în ordine alfabetică.
Iată ordinea în care WordPress încarcă aproape totul: http://codex.wordpress.org/Action_Reference#Actions_Run_During_a_Typical_Request
Lucrul important este că de obicei nu contează în ce ordine este încărcat fiecare plugin individual, deoarece pluginurile bine scrise vor folosi hook-uri WordPress, care vă permit să conectați funcționalități în puncte specifice ulterioare din inițializarea WordPress. (Pluginurile bine scrise vor folosi și prefixe pentru funcțiile și clasele lor pentru a evita conflictele.)
Mai multe informații despre API-ul de pluginuri: http://codex.wordpress.org/Plugin_API/
Răspuns la a doua întrebare:
Depinde în totalitate de plugin. WordPress încarcă doar un singur fișier din plugin, cel care este de obicei numit the-plugin-name.php
și conține titlul, descrierea, autorul etc. în partea de sus. Este responsabilitatea pluginului să încarce restul fișierelor sale, folosind require_once
și wp_enqueue_script
și altele asemenea.

Deci dacă creez un plugin, iar mai târziu lansez un plugin add-on care ar trebui să ruleze după ce plugin-ul original a fost executat, cum pot asigura această ordine?

Depinde foarte mult de ce încerci să realizezi. În general, ai putea configura fiecare dintre ele să ruleze pe un anumit hook folosind funcția add_action(), care îți permite să setezi prioritatea. http://codex.wordpress.org/Function_Reference/add_action

@SeventhSteel Dar dacă un plugin se bazează pe hook-ul creat de alt plugin. Dacă un plugin folosește apply_filters()
pentru a crea un hook, dar rulează înaintea unui plugin care folosește add_filter()
, atunci va funcționa totuși? Logic, se pare că apply_filters()
ar fi fost deja declanșat, așa că apelurile add_filter()
din al doilea plugin nu vor face nimic. Contează ordinea în care plugin-urile se încarcă atunci când folosești doar hook-uri create de plugin-uri?

Important este ce s-a încărcat până când rulează apply_filters()
. add_filter()
trebuie să ruleze înainte de apply_filters()
. Dacă add_filter()
se află într-un fișier de plugin și nu în altă funcție, acesta va rula pe hook-ul plugins_loaded
, care în general se va întâmpla înainte să aveți nevoie de apply_filters()
.

Un scenariu comun este atunci când aveți mai multe plugin-uri care adaugă conținutul lor după the_content
-- cum este determinată ordinea în care acestea apar?

Consider utilă includerea unei acțiuni de 'încărcare întârziată' în plugin-ul meu care rulează după ce toate plugin-urile și-au finalizat încărcarea, astfel:
add_action('plugins_loaded', 'my_late_loader');
Funcția my_late_loader este inițializată după toate celelalte plugin-uri, ceea ce îmi permite să folosesc hook-uri definite de alte plugin-uri în propria mea funcție my_other_function, care este inițializată în interiorul my_late_loader.
/**
* Funcție de încărcare întârziată pentru acțiuni care trebuie să ruleze după încărcarea
* tuturor plugin-urilor
*/
function my_late_loader(){
add_action( 'some_hook', 'my_other_function', 10, 1);
}
Puțin încâlcit (știu), dar acest lucru asigură că hook-urile din alte plugin-uri sunt create înainte de a fi adăugate, indiferent de ordinea de încărcare a plugin-urilor.

Nu există un concept de a crea un action/filter/hook, așa că acest lucru nu este necesar. Puteți apela add_filter() sau add_action() în orice moment, iar începând cu acel moment, orice apel la apply_filter() sau do_action() care folosește același nume va duce la executarea funcției dumneavoastră.
Dacă ați folosi acest lucru pentru a executa o acțiune sau a aplica un filtru, atunci ar fi corect, deoarece astfel ați permis altor plugin-uri să se înregistreze pentru evenimentele dumneavoastră.

Filtrele și acțiunile rulează într-o anumită ordine. Dacă doriți ca o acțiune să ruleze după toate celelalte acțiuni, atunci această abordare poate fi folosită. Desigur, puteți crea acțiuni și filtre. Nu am nicio idee ce încercați să spuneți în comentariul dumneavoastră.

Am ajuns inițial pe această pagină cu aceeași întrebare ca și cea primul utilizator. Ambele răspunsuri oferite de @SeventhSteel și @Clinton conțin informații foarte utile, dar necesită o analiză suplimentară. După cum se menționează în aceste răspunsuri, un plugin bine scris va folosi hook-uri și va avea un apel similar cu următorul:
add_action('init', 'function_to_add');
Primul parametru reprezintă "numele acțiunii" la care funcția ta – al doilea parametru – este conectată. Acțiunea specificată este principalul factor care determină momentul în care plugin-ul tău este încărcat. Există un al treilea parametru opțional (prioritate) care oferă un anumit control asupra locului în care funcția ta este încărcată în cadrul acelui grup. (Deși acest lucru nu este foarte precis, deoarece adesea ar fi dificil să cunoști prioritățile tuturor plugin-urilor instalate.) Există o listă excelentă a tuturor hook-urilor de acțiune disponibile cu explicații pentru diferite tipuri de cereri în WordPress Codex.
În ceea ce privește a doua întrebare, după cum se menționează în documentația Plugin Basics:
Când WordPress încarcă lista de plugin-uri instalate pe pagina de Plugin-uri din Adminul WordPress, caută în folderul de plugin-uri (și subfolderele acestuia) pentru a găsi fișiere PHP cu comentarii de antet pentru plugin-uri WordPress.
Deci, fișierul din plugin-ul tău care conține antetul (conform documentației, ar trebui să fie doar unul) va fi încărcat primul. Vezi răspunsul lui @Clinton pentru sugestii despre gestionarea mai multor hook-uri într-un singur plugin.
Dacă ai ajuns la acest răspuns (ca și mine) ca dezvoltator de plugin-uri WordPress pentru prima dată, găsești mult mai multe informații utile în Manualul de Plugin-uri WordPress.

În legătură cu dependența dintre plugin-uri, am constatat că cea mai ușoară modalitate de a controla ordinea în care se încarcă este prin înfășurarea init
cu:
add_action('init', 'init_first', 11); în first_plugin.php
add_action('init', 'init_second', 12); în second_plugin.php
Astfel, ordinea reală în care se încarcă poate fi încă aleatorie, dar ordinea în care rulează va fi determinată de prioritatea pe care o dai.
Yaakov.
