¿Cómo asegura WordPress que los complementos se ejecutan al mismo tiempo y cómo resuelve la dependencia de un complemento en otra?

2

Supongamos que tengo un complemento que activa plugin_1_action cuando se inicializa.

Ahora, debido a que quiero extender ese complemento, lo conectaré a plugin_1_action , pero ¿qué sucede si mi complemento se instaló después de ese complemento? ¿El complemento no se ejecutará primero y, entonces, perderé la oportunidad de capturar el plugin_1_action hook?

Para mí es raro y mágico que pueda, sin importar qué, enganchar, decir, las acciones de Woo y Woo puede engancharse en las mías, incluso si claramente mi complemento se ha instalado más tarde.

Incluso si la mayoría de los complementos se ejecutan en el gancho init (para que se ejecuten en el mismo espacio), todavía tienen prioridades establecidas de manera diferente. Lo que significa que el código de plugin1 se ejecutará antes del código de plugin2 y si plugin2 tiene un gancho en plugin1, bueno, mala suerte ... o no, al parecer, WordPress no tiene este problema.

¿Cómo funciona?

    
pregunta coolpasta 30.07.2018 - 04:15

2 respuestas

3

Si el complemento ejecuta plugin_1_action tan pronto como se carga , lo que significa que la llamada do_action() solo se encuentra en el archivo del complemento y no dentro de una función que está conectada más tarde, entonces sí, estás en lo correcto: no podrás conectarte si tu complemento se carga más tarde.

Esto es casi nunca como funcionan los complementos. Casi todos los complementos no ejecutarán ningún código tan pronto como se carguen. Por lo general, los complementos engancharán toda su funcionalidad para que ocurra más tarde, generalmente no antes del init hook, que se ejecuta después de que se hayan cargado todos los complementos y temas.

Así que digamos que el complemento original tiene este código:

function og_plugin_initialize() {
    // Does stuff.

    do_action( 'og_plugin_initialized' );
}

Este código probablemente se enganche para ejecutarse en el gancho init :

add_action( 'init', 'og_plugin_initialize', 20 );

Por lo tanto, og_plugin_initialized hook no se ejecutará hasta que init hook, en la prioridad 20.

Si tuvieras una función que quisieras enganchar en el gancho og_plugin_initialized , entonces lo agregarías en tu complemento de esta manera:

function my_plugin_init() {
    // Do stuff.
}
add_action( 'og_plugin_initialized', 'my_plugin_init' );

Cuando se hace de esta manera, no importa en qué orden se carguen los complementos, ya que ambos complementan y ponen en cola sus funciones para ejecutarse más tarde. Y dado que ambas funciones se ejecutarán después de que se hayan cargado todos los complementos, puede usar las funciones definidas en el complemento original sin problemas.

    
respondido por el Jacob Peattie 30.07.2018 - 04:32
2

Importante: Piense en las acciones y los ganchos como eventos

Ese modelo mental te servirá mucho mejor.

  

Ahora, debido a que quiero extender ese complemento, me conecto a plugin_1_action, pero ¿qué sucede si mi complemento se instaló después de ese complemento?

Puede instalar sus complementos en el orden que desee, todos ellos se cargan en el mismo orden, independientemente. Instalar el complemento C primero no significa que su código se ejecute primero.

Los complementos se cargan alfabéticamente, por lo que el complemento a se cargará antes que el complemento b porque A aparece antes que B, etc.

  

¿El complemento no se ejecutará primero y, entonces, perderé la oportunidad de atrapar el gancho plugin_1_action?

Correcto, si la acción se desencadena una vez, y ese evento ya ocurrió, entonces es demasiado tarde. Aún puedes conectarte a él, pero ese evento ya ha ocurrido, por lo que nunca se ejecutará.

Es similar a decirle a alguien que compre leche después de haber ido a la tienda en lugar de antes. Puede hacerlo, pero no obtendrá leche a menos que visite la tienda por segunda vez.

Para que aún funcione debería involucrar algún tipo de viaje en el tiempo / mecánica temporal. Dr Who podría hacerlo, pero necesitaremos refactorización para corregir el complemento original.

  

Para mí es raro y mágico que pueda, sin importar qué, enganchar, decir, las acciones de Woo y Woo puede engancharse en las mías,

Las acciones son solo acciones, no pertenecen a nadie. No hay espacio de prueba para el código, y una vez que se carga, se carga. Un código de complementos comparte todo el mismo espacio que WP Core y otros complementos.

  

incluso si claramente mi complemento se ha instalado más tarde que él.

El orden de instalación es irrelevante. Como también aprendimos anteriormente, el orden de ejecución es importante, una vez que se activa el evento / acción / enganche, aún puede engancharse en él, pero sus funciones no se ejecutarán hasta que se vuelva a disparar, lo que tal vez nunca suceda. Los ganchos WP no hacen viajes en el tiempo.

  

Incluso si la mayoría de los complementos se ejecutan en el gancho de inicio (para que se ejecuten en el mismo espacio), aún tienen prioridades establecidas de manera diferente.

De hecho, si el evento aún no ha ocurrido, puede indicar la prioridad para influir en el orden en que se llaman las funciones.

  

Lo que significa que el código de plugin1 se ejecutará antes que el código de plugin2 y si plugin2 tiene un gancho en plugin1, bueno, mala suerte ... o no, al parecer WordPress no tiene este problema.

Oh, pero lo hace! Como mencioné anteriormente, puede agregar funciones a un gancho que ya se disparó, eso no significa que se aplique retroactivamente a las veces anteriores al gancho disparado. Como mencioné anteriormente, eso requeriría tecnología de viaje en el tiempo.

El problema raíz aquí es que el complemento está funcionando antes de que ocurran los enlaces init o admin_init . Cuando se cargan los complementos, deben configurar sus objetos, agregar sus ganchos, etc., pero no deben hacer ningún trabajo. Para eso están los eventos del ciclo de vida de init etc.

    
respondido por el Tom J Nowell 30.07.2018 - 06:32

Lea otras preguntas en las etiquetas