In che ordine WordPress carica i file dei plugin?
In che ordine vengono caricati i plugin in WordPress?
E all'interno della cartella di un particolare plugin, quale ordine viene seguito per il caricamento?

Risposta alla prima domanda:
In
wp-settings.php
, WordPress controlla prima la presenza di eventuali plugin must-use (plugin nella cartella opzionalemu-plugins
) e li carica.Poi, se stai utilizzando un'installazione multisite, controlla i plugin attivati a livello di rete e li carica.
Infine controlla tutti gli altri plugin attivi cercando la voce
active_plugins
nella tabella del databasewp_options
, e li scorre uno per uno. I plugin verranno elencati in ordine alfabetico.
Ecco l'ordine in cui WordPress carica praticamente tutto: http://codex.wordpress.org/Action_Reference#Actions_Run_During_a_Typical_Request
Il punto è che di solito non importa in quale ordine viene caricato ogni singolo plugin, perché i plugin scritti correttamente utilizzano gli hook di WordPress, che ti permettono di inserire funzionalità in punti specifici successivi nell'avvio di WordPress. (I plugin scritti correttamente inoltre prefisseranno le loro funzioni e classi in modo da evitare conflitti.)
Maggiori informazioni sull'API dei plugin: http://codex.wordpress.org/Plugin_API/
Risposta alla seconda domanda:
Dipende totalmente dal plugin. WordPress carica solo un file nel plugin, quello che di solito si chiama the-plugin-name.php
e contiene il titolo, la descrizione, l'autore, ecc. in cima. Spetta al plugin caricare il resto dei suoi file, utilizzando require_once
e wp_enqueue_script
e simili.

Quindi, se creo un plugin e successivamente rilascio un plugin aggiuntivo che dovrebbe essere eseguito dopo il plugin originale, come posso assicurarmi che l'ordine sia corretto?

Dipende davvero da quello che stai cercando di fare. Ma in generale, dovresti impostare ciascuno di essi per essere eseguito su un hook specifico utilizzando la funzione add_action(), che ti permette di impostare la priorità. http://codex.wordpress.org/Function_Reference/add_action

@SeventhSteel Ma cosa succede se un plugin dipende dall'hook creato da un altro plugin. Se un plugin utilizza apply_filters()
per creare un hook, ma viene eseguito prima di un plugin che utilizza add_filter()
, funzionerà comunque? Logicamente, sembra che apply_filters()
sia già stato eseguito, quindi le chiamate add_filter()
nel secondo plugin non faranno nulla. Ha importanza l'ordine in cui i plugin vengono caricati quando si utilizzano solo hook creati dai plugin?

Ciò che conta è ciò che è stato caricato quando viene eseguito apply_filters()
. add_filter()
deve essere eseguito prima di apply_filters()
. Se add_filter()
si trova in un file di plugin e non in un'altra funzione, verrà eseguito sull'hook plugins_loaded
, che generalmente avviene prima che tu abbia bisogno di apply_filters()
.

Uno scenario comune è avere diversi plugin che aggiungono il loro contenuto dopo the_content
-- come viene determinato l'ordine del loro aspetto?

Trovo utile includere un'azione di 'caricamento tardivo' nel mio plugin che viene eseguita dopo che tutti i plugin hanno completato il loro caricamento, in questo modo:
add_action('plugins_loaded', 'my_late_loader');
La funzione my_late_loader viene quindi avviata dopo tutti gli altri plugin, il che mi permette di utilizzare hook definiti da altri plugin nella mia funzione my_other_function che viene avviata all'interno di my_late_loader
/**
* Funzione di caricamento tardivo per azioni che devono essere eseguite
* dopo che tutti i plugin sono stati caricati
*/
function my_late_loader(){
add_action( 'some_hook', 'my_other_function', 10, 1);
}
Un po' contorto (lo so), ma questo garantisce che gli hook negli altri plugin vengano creati prima di essere aggiunti, indipendentemente dall'ordine di caricamento dei plugin.

Non esiste una cosa come "creare" un action/filter/hook, quindi non è necessario. Puoi chiamare add_filter() o add_action() in qualsiasi momento, e da quel momento in poi, qualsiasi chiamata a apply_filter() o do_action() con lo stesso nome risulterà nell'esecuzione della tua funzione.
Se lo usassi per eseguire un'azione o applicare un filtro sarebbe corretto, poiché in questo modo permetteresti ad altri plugin di registrare il loro interesse nei tuoi eventi.

Sono arrivato originariamente a questa pagina con la stessa domanda del primo caso. Entrambe le risposte di @SeventhSteel e @Clinton forniscono dati molto utili, ma richiedono ulteriori approfondimenti. Come affermato in quelle risposte, il tuo plugin scritto correttamente utilizzerà hook, e avrà una chiamata simile alla seguente):
add_action('init', 'function_to_add');
Il primo parametro è "il nome dell'azione" a cui la tua funzione — il secondo parametro — è agganciata. L'azione specificata è il determinante principale di quando il tuo plugin viene caricato. C'è un terzo parametro opzionale (priorità) che ti dà un certo controllo granulare su dove all'interno di quel gruppo viene caricata la tua funzione. (Anche se questo è difficilmente preciso poiché spesso sarebbe difficile conoscere le priorità di tutti i plugin installati.) C'è un'eccellente lista di tutti gli action hook disponibili con relative spiegazioni per vari tipi di richiesta nel WordPress Codex.
Per quanto riguarda la seconda domanda, come affermato nella documentazione Plugin Basics:
Quando WordPress carica l'elenco dei plugin installati nella pagina Plugin dell'Admin di WordPress, cerca nella cartella dei plugin (e nelle sue sottocartelle) file PHP con commenti di intestazione del plugin WordPress.
Quindi il file nel tuo plugin con l'intestazione (secondo la documentazione, dovrebbe essercene solo uno) verrà caricato per primo. Vedi la risposta di @Clinton per suggerimenti su come gestire più hook all'interno di un singolo plugin.
Se sei arrivato a questa risposta (come ho fatto io) come sviluppatore di plugin WordPress alle prime armi, c'è molta altra informazione utile nel Plugin Handbook di WordPress.

Riguardo alla dipendenza tra plugin, ho scoperto che il modo più semplice per controllare l'ordine in cui vengono caricati è racchiudere l'init
con:
add_action('init', 'init_first', 11); nel file first_plugin.php
add_action('init', 'init_second', 12); nel file second_plugin.php
Quindi l'ordine effettivo di caricamento potrebbe essere ancora casuale, ma l'ordine di esecuzione sarà determinato dalla priorità che assegni.
Yaakov.
