perché i plugin vengono caricati prima delle funzioni pluggable
Direttamente dal sorgente per pluggable.php
:
<?php
/**
* Queste funzioni possono essere sostituite tramite plugin. Se i plugin non ridefiniscono queste
* funzioni, allora verranno utilizzate queste.
*
* @package WordPress
*/
?>
Quindi, ecco la tua risposta, le funzioni in pluggable.php
sono progettate per essere sovrascritte dai Plugin.
Riguardo all'ordine di caricamento:
Vedi questo post di Konstantin Kovshenin. I punti rilevanti (10-15):
wp_get_active_and_valid_plugins()
recupera l'elenco di tutti i file dei plugin attivi per il caricamento e li include. Questo è il punto in cui il codice del tuo plugin viene eseguito, vengono definite funzioni, classi, ecc.- Include
wp-includes/wp-pluggable.php
ewp-includes/wp-pluggable-deprecated.php
che includono funzioni (e funzioni deprecate) che possono essere ridefinite dai plugin. Comewp_mail()
per mailing più avanzati,wp_authenticate()
per metodi di autenticazione alternativi, ecc.wp_set_internal_encoding()
viene chiamato per impostare la codifica interna in base all'opzione blog_charset.wp_cache_postload()
viene chiamato se la cache degli oggetti è abilitata.- A questo punto viene attivata un'azione
plugins_loaded
. Questa è la primissima azione (dopo muplugins_loaded attivato prima del caricamento dei plugin WordPress non multi-sito) a cui puoi agganciarti, viene prima di init perché WordPress non è ancora stato inizializzato, almeno non completamente.
Quindi, semplificato:
- I plugin vengono caricati
pluggable.php
viene caricato- Viene attivata l'azione
plugins_loaded
Che è l'ordine previsto.
(Nota: tutto questo avviene in wp-settings.php
.)

Il dubbio è, come hai detto se le funzioni di pluggable.php vengono sovrascritte dal plugin significa che pluggable.php dovrebbe essere stato caricato prima dei plugin. Ma il Diagramma mostra l'ordine inverso.

Ogni definizione di funzione in pluggables
è preceduta da un controllo if(!function_exists('{nome funzione}') {
. WordPress verifica se hai definito manualmente una di queste funzioni nei tuoi plugin prima di definirle autonomamente.

@EAMann Grazie EAMann, ora sono molto chiaro sulla mia domanda, ad esempio, se il plugin definisce la funzione wp_set_current_user
, allora in pluggable.php, wp_set_current_user
non verrà definita come if ( !function_exists('wp_set_current_user') ) :
, ho ragione?

Non utilizzare funzioni pluggable!
Nota bene che non puoi mai essere certo che un plugin successivo non sovrascriva le tue funzioni pluggable! Ho scritto su wp-hackers mailing list riguardo questo qualche tempo fa.
C'è anche un altro thread su wp-hackers che discute del fatto che non è stato implementato alcun fallback. Per favore leggi anche il ticket trac correlato.
