por qué los plugins se cargan antes que las funciones pluggables
Directamente desde el código fuente de pluggable.php
:
<?php
/**
* Estas funciones pueden ser reemplazadas mediante plugins. Si los plugins no redefinen estas
* funciones, entonces se utilizarán estas en su lugar.
*
* @package WordPress
*/
?>
Así que ahí tienes la respuesta, las funciones en pluggable.php
están diseñadas para ser sobrescritas por Plugins.
Respecto al orden de carga:
Consulta esta publicación de Konstantin Kovshenin. Los puntos relevantes (10-15):
wp_get_active_and_valid_plugins()
recupera la lista de todos los archivos de plugins activos para cargarlos y los incluye. Este es el punto donde el código de tu plugin se ejecuta, se definen funciones, clases, etc.- Incluye
wp-includes/wp-pluggable.php
ywp-includes/wp-pluggable-deprecated.php
que contienen funciones (y funciones obsoletas) que pueden ser redefinidas por plugins. Comowp_mail()
para envíos de correo más avanzados,wp_authenticate()
para métodos alternativos de autenticación, etc.- Se llama a
wp_set_internal_encoding()
para establecer la codificación interna según la opción blog_charset.- Se llama a
wp_cache_postload()
si el almacenamiento en caché de objetos está habilitado.- En este punto se dispara la acción
plugins_loaded
. Esta es la primera acción (después de muplugins_loaded que se dispara antes de cargar los plugins de WordPress no multisitio) en la que puedes enganchar, viene antes del init porque WordPress aún no ha sido inicializado, al menos no completamente.
Entonces, simplificado:
- Los plugins se cargan
- Se carga
pluggable.php
- Se dispara la acción
plugins_loaded
Que es el orden esperado.
(Nota: todo esto ocurre en wp-settings.php
.)

La duda es, como dijiste si las funciones de pluggable.php son anuladas por un plugin, significa que pluggable.php debería haberse cargado antes que los plugins. Pero el diagrama del enlace muestra el orden inverso.

Cada definición de función en pluggables
está precedida por una verificación if(!function_exists('{function name}') {
. WordPress verifica si has definido manualmente alguna de estas funciones en tus propios plugins antes de definirlas por sí mismo.

@EAMann Gracias EAMann, ahora tengo muy clara mi pregunta. Por ejemplo, si el plugin define la función wp_set_current_user
, entonces en pluggable.php, wp_set_current_user
no será definida como if ( !function_exists('wp_set_current_user') ) :
, ¿Estoy en lo correcto?

¡No uses funciones pluggable!
Por favor, ten en cuenta que nunca puedes estar seguro de que un plugin posterior no sobrescriba tus funciones pluggable! Escribí sobre esto en la lista de correo de wp-hackers hace algún tiempo.
También hay otro hilo en wp-hackers que habla sobre que no hay un sistema de respaldo implementado. Por favor, lee también el ticket relacionado en trac.
