por qué los plugins se cargan antes que las funciones pluggables

17 ene 2012, 18:24:46
Vistas: 1.42K
Votos: 4

Flujo de carga de WordPress

Obtuve esta imagen de un libro electrónico sobre desarrollo de plugins para WP. ¿Podrías explicarme por qué los Plugins se cargan antes que las Pluggables?

1
Comentarios

Por favor, revisa la licencia. Todo el contenido aquí tiene licencia GNU GPL. Si la imagen no la tiene, entonces por favor elimínala y reemplázala con una propia. De lo contrario, el cielo podría caer sobre tu cabeza.

kaiser kaiser
17 ene 2012 20:15:51
Todas las respuestas a la pregunta 2
5

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):

  1. 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.
  2. Incluye wp-includes/wp-pluggable.php y wp-includes/wp-pluggable-deprecated.php que contienen funciones (y funciones obsoletas) que pueden ser redefinidas por plugins. Como wp_mail() para envíos de correo más avanzados, wp_authenticate() para métodos alternativos de autenticación, etc.
  3. Se llama a wp_set_internal_encoding() para establecer la codificación interna según la opción blog_charset.
  4. Se llama a wp_cache_postload() si el almacenamiento en caché de objetos está habilitado.
  5. 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:

  1. Los plugins se cargan
  2. Se carga pluggable.php
  3. Se dispara la acción plugins_loaded

Que es el orden esperado.

(Nota: todo esto ocurre en wp-settings.php.)

17 ene 2012 18:40:19
Comentarios

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.

A.C.Balaji A.C.Balaji
17 ene 2012 18:48:08

El orden ocurre como se esperaba. Ver respuesta actualizada.

Chip Bennett Chip Bennett
17 ene 2012 19:12:40

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 EAMann
17 ene 2012 19:32:37

@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?

A.C.Balaji A.C.Balaji
17 ene 2012 19:48:12

Tienes razón. Si defines la función en tu propio plugin, WordPress usará tu versión en lugar de la que está en pluggables.php.

EAMann EAMann
17 ene 2012 20:29:56
0

¡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.

17 ene 2012 20:21:18