web-dev-qa-db-fra.com

Dans un plugin, pourquoi add_action ('init') n'est-il pas exécuté avant l'activation du plug-in?

Je suis nouveau dans le développement Wordpress (et php en général), donc je suis confus quant à l'exécution des fonctions dans le fichier php de mon plugin. J'ai vu plusieurs guides indiquant la création d'une fonction register_activation_hook, qui est exécutée lorsque le plug-in est activé. Cependant, après la fonction de raccordement d'activation, il existe toujours un appel add_action('init') qui ajoute de nombreuses options à la base de données.

Ma question est donc la suivante: lorsque Wordpress évalue le fichier php de mon plug-in et trouve l'appel register_activation_hook, pourquoi n'exécute-t-il pas l'appel add_action('init') tant que après que le plugin ne soit activé? Si Wordpress évalue le fichier php de mon plugin et qu'il existe un appel de fonction à add_action('init') dans le fichier, il semble que cet appel de fonction serait exécuté lors de l'évaluation de la page, car il ne fait pas partie d'une structure de contrôle.

Je sais que Wordpress évalue ce fichier avant de l'activer, car il connaît le nom de mon plugin, son auteur et tout cela avant son activation. Donc, s'il évalue le fichier, pourquoi n'exécute-t-il pas l'appel add_action('init')?

Ma question a-t-elle un sens? Quelqu'un peut-il m'aider à comprendre pourquoi les choses fonctionnent de cette façon?

Voici un exemple de ce dont je parle:

register_activation_hook(__FILE__, 'halloween_store_install');

function halloween_store_install() {
    $hween_options_arr = array(
        'currency_sign' => '$'
    );

    //save our default option values
    update_option( 'halloween_options', $hween_options_arr );
}

add_action( 'init', 'halloween_store_init' ); // <-- why is this not executed until my plugin is activated?

function halloween_store_init(){
    $labels = array(
        'name' => __( 'Products', 'halloween-plugin' ),
        'singular_name' => __( 'Product', 'halloween-plugin' ),
        'add_new' => __( 'Add New', 'halloween-plugin' ),
        'add_new_item' => __( 'Add New Product', 'halloween-plugin' ),
        'edit_item' => __( 'Edit Product', 'halloween-plugin' ),
        'new_item' => __( 'New Product', 'halloween-plugin' ),
        'all_items' => __( 'All Products', 'halloween-plugin' ),
        'view_item' => __( 'View Product', 'halloween-plugin' ),
        'search_items' => __( 'Search Products', 'halloween-plugin' ),
        'not_found' => __( 'No products found', 'halloween-plugin' ),
        'not_found_in_trash' => __( 'No products found in Trash', 'halloween-plugin' ),
        'menu_name' => __( 'Products', 'halloween-plugin' )
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'show_ui_menu' => true,
        'query_var' => true,
        'rewrite' => true,
        'capability_type' => 'post',
        'has_archive' => true,
        'hierarchical' => false,
        'menu_position' => null,
        'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt' )
    );

    register_post_type( 'halloween-products', $args);
}
2
Tyler Jones

WordPress est une application et tout ce qui est exécuté dans cette application est appelé par des points d'ancrage.

Ensuite, les 2 fonctions de hook principales sont add_action et add_filter , mais comme vous l'avez vu, register_activation_hook et register_deactivation_hook sont d'autres fonctions utilisées dans le contexte d'activation et de désactivation.

Il existe plus de fonctions de définition de hook, telles que des fonctions qui accrocheront des actions sensibles au temps (pseudo-cron) comme wp_schedule_event par exemple.

Le codex offre une bonne liste de hooks d’action disponibles (classés par leur séquence généralement appelée) à utiliser avec add_actions et les filtres à utiliser avec add_filter .

Je ne suis pas au courant d'une telle liste pour tous les crochets définissant des fonctions.

Comme je l'ai dit dans mon commentaire, la plupart de ces fonctions sont simplement des wrappers intelligents pour les fonctions call_user_func de PHP qui donnent un contexte à ces hooks.

Ainsi, lorsqu'un plugin ou un thème est installé, il ne s'exécutera pas automatiquement même si leurs fichiers sont techniquement lus (au moins les fichiers principaux le sont).

Dans le fichier principal d'un plugin ou theme , vous trouverez une section de commentaire définissant le paramètre du plugin/thème, telle que le nom du thème, l'auteur, la version, etc.

Dans les thèmes, le fichier style.css serait lu et contiendrait quelque chose de similaire à ceci

/*
 Theme Name: Twenty Thirteen
 Theme URI: http://wordpress.org/themes/twentythirteen
 Author: the WordPress team
 Author URI: http://wordpress.org/
 Description: The 2013 theme for WordPress takes us back to the blog, featuring a full range of post formats, each displayed beautifully in their own unique way. Design details abound, starting with a vibrant color scheme and matching header images, beautiful typography and icons, and a flexible layout that looks great on any device, big or small.
 Version: 1.0
 License: GNU General Public License v2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
 Tags: black, brown, orange, tan, white, yellow, light, one-column, two-columns, right-sidebar, flexible-width, custom-header, custom-menu, editor-style, featured-images, microformats, post-formats, rtl-language-support, sticky-post, translation-ready
 Text Domain: twentythirteen

 This theme, like WordPress, is licensed under the GPL.
 Use it to make something cool, have fun, and share what you've learned with others.
*/

De même, dans le fichier principal PHP d'un plugin, vous trouverez une section de commentaires contenant quelque chose de similaire à celui-ci.

/*
 Plugin Name: My Toolset
 Plugin URI:  http://URI_Of_Page_Describing_Plugin_and_Updates
 Description: This describes my plugin in a short sentence
 Version:     1.5
 Author:      John Smith
 Author URI:  http://URI_Of_The_Plugin_Author
 License:     GPL2
 License URI: https://www.gnu.org/licenses/gpl-2.0.html
 Domain Path: /languages
 Text Domain: my-toolset
*/

Enfin, une fois qu'un thème/plugin est activé, il continue à charger le reste de ses fichiers en suivant la séquence de chargement des points d'ancrage de WP et charge tout ce que les développeurs ont accroché à ces points ou filtres d'action.

Et dans les fonctions créées par ces développeurs, toute la magie se produit pour ce plugin ou thème particulier.

Une explication assez complète et intéressante à lire de la séquence de chargement de WP a été faite par userabuser here .

2
bynicolas