Entre functions.php (tema), widgets y plugins, ¿cuál se carga primero?
El cliente pregunta si un plugin específico de carrusel que utiliza puede ser convertido en widget. Esto significa que debería crear un widget dentro de functions.php que llame a la función del plugin. Esto implica que el código del plugin debe cargarse primero para que la función esté disponible para WordPress cuando se cargue el archivo functions.php, ¿correcto? ¿Funcionaría esto?

Los plugins se cargan justo antes del tema (sí, he estado buscando una excusa para usar esto):
Sin embargo, es incorrecto pensar en cualquiera de ellos como punto de ejecución de código. Para la mayoría de los casos, todo debería estar enganchado y ejecutarse no antes del hook init
. Según el Codex, el registro de widgets con register_widget()
debería engancharse a widget_init
.
Debido a esto, el orden de carga no importa para este caso, ya que tendrás todo cargado para cuando el widget lo necesite en cualquier situación.

@jgraup lo dices como si las cosas cambiaran en el núcleo de WordPress... :)

Solo para asegurarme de que entiendo este gráfico - ¿Las secciones que se extienden a través de más de una de las 3 columnas principales son comunes a todas? ¿Así que estoy siguiendo una línea vertical hacia abajo y cruzando los eventos en orden cronológico para una solicitud dada?

Un enfoque interesante sería listar todos los hooks en un archivo en orden de ejecución.
add_action( 'all', '_20161224_printer' );
function _20161224_printer( $r ){
$line = microtime(true)*10000 . ' ' . $r . "\n";
$fp = fopen( ABSPATH . 'hooks.txt', 'a+');
fwrite($fp, $line);
fclose($fp);
}
Y obtendrás una salida como esta:
14825992300742 pre_option_blog_charset
14825992300743 option_blog_charset
14825992300743 plugins_loaded
14825992300744 load_default_widgets
14825992300745 load_default_embeds
14825992300745 wp_audio_extensions
14825992300745 wp_audio_embed_handler
14825992300746 wp_video_extensions
14825992300746 wp_video_embed_handler
14825992300746 sanitize_comment_cookies
14825992300747 pre_option_permalink_structure
14825992300747 option_permalink_structure
14825992300748 pre_option_wp_user_roles
14825992300748 option_wp_user_roles
14825992300749 wp_roles_init
14825992300749 setup_theme
14825992300749 pre_option_template
14825992300750 option_template
14825992300750 template
14825992300750 theme_root
14825992300751 template_directory
14825992300751 pre_option_stylesheet
14825992300751 option_stylesheet
14825992300751 stylesheet
14825992300752 theme_root
14825992300752 stylesheet_directory
14825992300752 pre_option_WPLANG
14825992300753 query
14825992300754 default_option_WPLANG
14825992300755 locale
14825992300755 override_unload_textdomain
14825992300755 unload_textdomain
14825992300755 override_load_textdomain
14825992300756 load_textdomain
14825992300756 load_textdomain_mofile
14825992300756 locale
...
muchos más action hooks
...
14825992302886 wp_parse_str
14825992302886 nonce_life
14825992302886 salt
14825992302886 wp_parse_str
14825992302887 esc_html
14825992302887 logout_url
14825992302887 clean_url
14825992302887 gettext
14825992302887 wp_after_admin_bar_render
14825992302888 pre_option_template
14825992302888 option_template
14825992302888 template
14825992302888 theme_root
14825992302888 template_directory
14825992302889 parent_theme_file_path
14825992302889 shutdown
Nota: la lista completa simplemente no cabría en el límite de 30.000 caracteres por publicación de WPSO, así que eliminé muchos action hooks.
Coloca el código anterior dentro de un plugin. Si lo haces desde el
functions.php
del tema, no capturarásplugins_loaded
. Otra prueba más de que los plugins se cargan antes que el tema.
Los posibles beneficios de esta verificación son muchos, pero ten en cuenta que la salida será diferente para las distintas plantillas de página que llames, o si estás en el panel de administración.
Simplemente llamé esto desde /?p=1
o la página Hello World.
Si no tienes ningún plugin activado, puedes colocar este código en la carpeta mu-plugins
.
Podría ser mejor usar la API de WP FS, pero esta forma es realmente concisa.

Puedes tener un widget dentro del archivo .php del plugin (y tener una variable global compartida que ambos puedan usar), si eso es lo que estás preguntando. Aquí hay un tutorial con código de ejemplo que encontré hace un tiempo.
También, aquí hay una lista de acciones que se ejecutan durante una petición típica, en orden de ejecución. Los puntos #2 y #10 sugieren que los plugins se cargan primero; no estoy seguro acerca de functions.php.
