Entre funciones.php, widgets y complementos, ¿cuál se carga primero?

77

El cliente pregunta si un plugin de carrusel específico que usa puede ser widgetizado. Eso significa que debería crear un widget dentro de functions.php que llame a la función del complemento. Eso significa que el código del complemento debe cargarse primero para que la función esté disponible para WordPress cuando se carga el archivo functions.php, ¿verdad? Funcionaría eso?

pixeline
fuente

Respuestas:

184

Los complementos se cargan justo antes del tema (sí, he estado buscando una excusa para usar esto):

ingrese la descripción de la imagen aquí

Sin embargo, es un error pensar en cualquiera de ellos como punto de ejecución del código. Para la mayoría de los casos, todo debe engancharse y ejecutarse no antes del initgancho. De acuerdo con el registro del widget Codex, register_widget()debe conectarse a widget_init.

Debido a que el orden de carga no importa para este caso, tendrá todo cargado cuando el widget de tiempo lo necesite en cualquier caso.

Rarst
fuente
3
La carga del núcleo de WP nunca tendrá sentido.
gagarina
77
¿Hay alguna posibilidad de que podamos obtener un gráfico actualizado en 2016? ;-)
jgraup
99
@jgraup dices que las cosas cambian en el núcleo de WordPress ... :)
Rarst
1
@Rarst, touché ;-)
jgraup
2
@IsaacLubow sí, las cosas en más de una columna se ejecutan para esos contextos respectivos, ya que puede ver que la misma parte significativa de la carga del núcleo siempre está involucrada para cualquier solicitud.
Rarst
16

Un enfoque interesante sería enumerar todos los enlaces a un archivo en una secuencia 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á la salida de esta manera:

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
...
many many more 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

Tenga en cuenta que la lista completa simplemente no puede ajustarse a la limitación de 30,000 caracteres por publicación de WPSO, por lo que eliminé muchos ganchos de acción.

Ponga el código anterior dentro de un complemento. Si haces eso desde los temas functions.phpque no captarás plugins_loaded. Otra prueba de que los complementos se cargan antes del tema.

Las posibles ventajas de esta verificación son muchas, pero tenga en cuenta que el resultado será diferente para las diferentes plantillas de página que llamará, o si está en un tablero.

Simplemente llamé a esto desde /?p=1la página de Hello World.

Si no tiene un solo complemento activado, puede poner este código en la mu-pluginscarpeta.

Puede ser mejor usar WP FS API , pero de esta manera es realmente conciso.

prosti
fuente
Los complementos internos de wp-admin se cargan después del tema o en el orden de la instalación ... y los complementos de front-end se cargan antes del tema ...
Vishal Kumar Sahu
3

Puede tener un widget dentro del archivo .php del complemento (y tener una variable global compartida que ambos pueden usar), si eso es lo que está preguntando. Aquí hay un tutorial con código de muestra que encontré hace un tiempo.

Además, aquí hay una lista de acciones ejecutadas durante una solicitud típica , en orden de ejecución. # 2 y # 10 sugieren que los complementos se carguen primero; no estoy seguro acerca de functions.php.

montrealist
fuente
1
Correcto, los complementos se cargan antes que los archivos de tema. Si el complemento incluye código, pero no el widget que desea, es posible definir el widget en las funciones de su tema.php.
goldenapples