Entre functions.php, widgets et plugins, lequel est chargé en premier?

77

Le client demande si un plugin de carrousel spécifique qu'il utilise peut être widgetisé. Cela signifie que je devrais créer un widget à l'intérieur de functions.php qui appelle la fonction du plugin. Cela signifie que le code du plugin doit être chargé en premier pour que la fonction soit disponible pour WordPress lors du chargement du fichier functions.php, n'est-ce pas? Cela fonctionnerait-il?

pixeline
la source

Réponses:

184

Les plugins sont chargés juste avant le thème (oui, je cherchais une excuse pour l'utiliser):

entrez la description de l'image ici

Cependant, il est faux de penser à l'un ou l'autre point d'exécution du code. Dans la plupart des cas, tout doit être accroché et exécuté au plus tôt init. Selon l'enregistrement de widget Codex avec register_widget()doit être connecté widget_init.

En raison de l'ordre de charge peu important dans ce cas, vous aurez tout ce qui est chargé par le widget temps qui en a besoin dans tous les cas.

Rarst
la source
3
La charge de base WP n'aura jamais aucun sens.
Gagarine
7
Avez-vous une chance d'obtenir un graphique mis à jour en 2016? ;-)
jgraup
9
@jgraup vous dites que, comme dans WordPress, les choses changent ... :)
Rarst
1
@Rarst, touché ;-)
jgraup
2
@IsaacLubow Oui, les éléments de plus d'une colonne sont exécutés pour ces contextes respectifs, comme vous pouvez le constater, le même bloc important de charge de base est toujours impliqué pour toute demande.
Rarst
16

Une approche intéressante serait de répertorier tous les points d'ancrage d'un fichier dans une séquence d'exécution.

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

}

Et vous obtiendrez le résultat comme ceci:

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

Notez que la liste complète ne pouvait tout simplement pas respecter la limite de 30 000 caractères par publication WPSO. J'ai donc supprimé de nombreux points d'ancrage.

Placez le code ci-dessus dans un plugin. Si vous faites cela à partir des thèmes, functions.phpvous ne pourrez pas attraper plugins_loaded. Une autre preuve que les plugins sont chargés avant le thème.

Les avantages de cette vérification sont nombreux, mais veuillez noter que le résultat sera différent pour les différents modèles de page que vous appellerez ou si vous êtes dans un tableau de bord.

J'ai simplement appelé cela depuis /?p=1ou la page Hello World.

Si vous n'avez pas activé un seul plugin, vous pouvez mettre ce code dans un mu-pluginsdossier.

Il peut être préférable d’utiliser l’ API WP FS , mais cette façon de procéder est vraiment concise.

prosti
la source
Les plugins internes de wp-admin sont chargés après le thème ou dans l'ordre de l'installation ... et les plugins front-end sont chargés avant le thème ...
Vishal Kumar Sahu
3

Vous pouvez avoir un widget dans le fichier .php du plugin (et avoir une variable globale partagée qu'ils peuvent tous les deux utiliser), si c'est ce que vous demandez. Voici un tutoriel avec un exemple de code sur lequel je suis tombé il y a quelque temps.

En outre, voici une liste des actions exécutées pendant une demande typique , dans l'ordre d'exécution. Les n ° 2 et 10 suggèrent que les plugins se chargent en premier; pas sûr de functions.php.

montréaliste
la source
1
Correct, les plugins sont chargés avant les fichiers de thème. Si le plugin inclut du code, mais pas le widget que vous souhaitez, il est possible de définir le widget dans le fichier functions.php de votre thème.
goldenapples