¿En qué orden carga WordPress los archivos de plugins?
¿En qué orden se cargan los plugins en WordPress?
Y dentro de la carpeta de un plugin en particular, ¿qué orden se sigue para la carga?

Respuesta a la primera pregunta:
En
wp-settings.php
, WordPress primero verifica si hay plugins de uso obligatorio (plugins en la carpeta opcionalmu-plugins
) y los carga.Luego, si estás ejecutando una instalación multisitio, verifica los plugins activados en la red y los carga.
Después, verifica todos los demás plugins activos buscando la entrada
active_plugins
en la tabla de la base de datoswp_options
, y recorre esos plugins. Los plugins se listarán en orden alfabético.
Aquí está el orden en que WordPress carga prácticamente todo: http://codex.wordpress.org/Action_Reference#Actions_Run_During_a_Typical_Request
La cuestión es que normalmente no importa el orden en que se carga cada plugin individual, porque los plugins bien escritos usan los hooks de WordPress, que permiten insertar funcionalidad en puntos específicos más adelante en el inicio de WordPress. (Los plugins bien escritos también prefijan sus funciones y clases para evitar conflictos).
Más información sobre la API de plugins: http://codex.wordpress.org/Plugin_API/
Respuesta a la segunda pregunta:
Depende totalmente del plugin. WordPress solo carga un archivo en el plugin, el que normalmente se llama el-nombre-del-plugin.php
y contiene el título, descripción, autor, etc. en la parte superior. Depende del plugin cargar el resto de sus archivos, usando require_once
, wp_enqueue_script
y demás.

Entonces, si creo un plugin y luego lanzo un plugin complementario que debería ejecutarse después del plugin original, ¿cómo puedo asegurar ese orden?

Realmente depende de lo que estés tratando de hacer. Pero generalmente configurarías cada uno para que se ejecute en un hook específico usando la función add_action(), que te permite establecer prioridad. http://codex.wordpress.org/Function_Reference/add_action

@SeventhSteel Pero, ¿qué pasa si un plugin depende del hook creado por otro plugin? Si un plugin usa apply_filters()
para crear un hook, pero se ejecuta antes que un plugin que usa add_filter()
, ¿funcionará? Lógicamente, parece que apply_filters()
ya se habrá ejecutado, por lo que las llamadas a add_filter()
en el segundo plugin no harán nada. ¿Importa el orden en que se cargan los plugins cuando solo se usan hooks creados por plugins?

Lo que importa es lo que se haya cargado para cuando se ejecute apply_filters()
. add_filter()
debe ejecutarse antes que apply_filters()
. Si add_filter()
está en un archivo de plugin y no dentro de otra función, se ejecutará en el hook plugins_loaded
, lo que generalmente ocurrirá antes de que necesites apply_filters()
.

Un escenario común es tener varios plugins que añaden su contenido después de the_content
-- ¿cómo se determina el orden de su aparición?

Encuentro útil incluir una acción de 'carga tardía' en mi plugin que se ejecute después de que todos los plugins hayan terminado de cargarse, así:
add_action('plugins_loaded', 'my_late_loader');
La función my_late_loader entonces se inicia después de los demás plugins, lo que me permite utilizar hooks definidos por otros plugins en mi propia función my_other_function que se inicia dentro de my_late_loader
/**
* Función de carga tardía para acciones que deben ejecutarse después
* de que todos los plugins se hayan cargado
*/
function my_late_loader(){
add_action( 'some_hook', 'my_other_function', 10, 1);
}
Un poco enrevesado (lo sé), pero esto asegura que los hooks en otros plugins se creen antes de ser añadidos, independientemente del orden de carga de los plugins.

No existe tal cosa como "crear" un action/filter/hook, por lo que esto no es necesario. Puedes llamar add_filter() o add_action() en cualquier momento, y a partir de ese instante, cualquier llamada a apply_filter() o do_action() que use el mismo nombre resultará en que tu función sea llamada.
Si usaras esto para ejecutar una acción o aplicar un filtro, eso sería correcto, ya que al hacerlo permites que otros plugins registren su interés en tus eventos.

Originalmente llegué a esta página con la misma pregunta que la primera. Tanto las respuestas de @SeventhSteel como @Clinton proporcionan datos muy útiles, pero requieren una investigación adicional. Como se menciona en esas respuestas, tu plugin bien escrito utilizará hooks, y tendrá una llamada similar a la siguiente:
add_action('init', 'function_to_add');
El primer parámetro es "el nombre de la acción" a la que tu función —el segundo parámetro— está enganchada. La acción especificada es el principal determinante de cuándo se carga tu plugin. Hay un tercer parámetro opcional (prioridad) que te da cierto control granular sobre dónde dentro de ese grupo se carga tu función. (Aunque esto apenas es preciso, ya que a menudo sería difícil conocer las prioridades de todos los plugins instalados). Hay una excelente lista de todos los hooks de acción disponibles con explicaciones para diferentes tipos de solicitudes en el Codex de WordPress.
En cuanto a la segunda pregunta, como se indica en la documentación de Conceptos Básicos de Plugins:
Cuando WordPress carga la lista de plugins instalados en la página de Plugins del Administrador de WordPress, busca a través de la carpeta de plugins (y sus subcarpetas) archivos PHP con comentarios de cabecera de plugins de WordPress.
Así que el archivo en tu plugin con la cabecera (según la documentación, debería haber solo uno) se cargará primero. Consulta la respuesta de @Clinton para obtener sugerencias sobre cómo manejar múltiples hooks dentro de un solo plugin.
Si llegaste a esta respuesta (como yo) siendo un desarrollador de plugins de WordPress por primera vez, hay mucha más información útil en el Manual de Plugins de WordPress.

Sobre la dependencia entre plugins, encontré que la forma más fácil de controlar el orden en que se cargan es envolviendo el init
con:
add_action('init', 'init_first', 11); en first_plugin.php
add_action('init', 'init_second', 12); en second_plugin.php
Así que el orden real en que se cargan podría seguir siendo aleatorio, pero el orden en que se ejecutan estará determinado por la prioridad que les des.
Yaakov.
