web-dev-qa-db-fra.com

Comment utilisez-vous la classe de chargeur de plug-in boilerplate pour accrocher des actions et des filtres?

La classe Plugin_Name_Loader du WordPress Plugin Boilerplate est très utile si vous devez vous connecter à une action ou à un filtre WordPress à partir de votre plugin. L'auteur original, Tom McFarlin, dit ce qui suit à propos de the loader :

Le but de ce fichier est d'encapsuler l'enregistrement des points d'ancrage, puis d'exécuter les actions et les filtres au moment approprié du chargement du plug-in.

Il est souvent nécessaire d’accrocher l’action ou le filtre approprié, alors comment tirer parti de la classe de chargeur du plug-in boilerplate et l’utiliser pour l’accrochage aux actions et aux filtres?

3
iyrin

Cette réponse suppose une compréhension de base du travail avec les classes et les objets. La réponse complète est un peu longue, donc passez au bas de la liste de contrôle si vous êtes impatient. Lisez et suivez toute la réponse si vous ne comprenez pas le résumé.


Afin de comprendre comment utiliser le chargeur, nous devrions examiner le code source de la classe de plug-in principale, Plugin_Name dans class-plugin-name.php .

Le premier bloc de code de cette classe déclare le conteneur privé $loader:

protected $loader;

Ensuite, nous voyons dans la construction que les fonctions load_dependencies et define_public_hooks() sont appelées:

public function __construct() {
    $this->plugin_name = 'plugin-name';
    $this->version = '1.0.0';
    // Our fearless loader is called from within this class object.
    $this->load_dependencies();
    $this->set_locale();
    $this->define_admin_hooks();
    $this->define_public_hooks();
}

Après la construction, nous voyons la fonction load_dependencies() définie. Voici où les fichiers de ressources pour les classes utilisées par le plugin sont appelés. Le premier fichier de ressources de classe que nous voyons être requis ici est plugin-name-loader.php .

require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-plugin-name-loader.php';

FAIRE CELA:

Requiert tous les fichiers de classe supplémentaires sur lesquels votre plug-in s'appuie dans la fonction load_dependencies().

Par exemple, si vous avez défini une classe appelée Plugin_Name_Alert dans le fichier class-plugin-name-alert.php situé dans le répertoire includes de votre plug-in, utilisez-la en ajoutant cette ligne à load_dependencies():

require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-plugin-name-alert.php';

La première étape est terminée.


En continuant notre examen, nous voyons que à la fin de cette fonction, notre conteneur précédemment déclaré appelé $loader est maintenant défini comme un nouvel objet de la classe Plugin_Name_Loader, ce qu'il peut faire maintenant car il était requis auparavant dans cette fonction. :

$this->loader = new Plugin_Name_Loader();

Maintenant sautons vers le bas et jetons un coup d'œil à define_public_hooks() . Ceci est une autre fonction qui a été appelée à partir de la construction plus tôt. C'est un bon endroit pour organiser les hooks utilisés par votre plugin. Voici à quoi ça ressemble:

private function define_public_hooks() {
    // Instantiates a new object of the class Plugin_Name_Public.
    $plugin_public = new Plugin_Name_Public( $this->get_plugin_name(), $this->get_version() );
    // This is where the loader's add_action hooks the callback function of the class object. 
    $this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'enqueue_styles' );
    // Another action is passed to the class object.
    $this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'enqueue_scripts' );
}

Vous pouvez voir deux choses importantes qui se passent ici:

  1. Un objet d'une classe est instancié.

  2. La version personnalisée de add_action() du chargeur est exécutée et accepte l'objet en tant qu'argument.

C'est là que le chargeur devient utile pour nous. Au lieu de transmettre uniquement la fonction hook et callback à add_action(), le chargeur utilise ses propres fonctions personnalisées add_action() et add_filter(), qui nous permettent de passer trois arguments: fonction hook, classe et callback. De cette façon, il sait trouver la fonction dans votre classe.

Pour référence, voici tous les les arguments acceptés par la version de add_action() du chargeur:

add_action( $hook, $component, $callback, $priority = 10, $accepted_args = 1 )

Bien qu'il existe des moyens de passer une fonction de classe à WordPress add_action() ou add_filter(), voici comment procéder par le biais du chargeur.

FAIRE AUSSI:

Dans la fonction define_public_hooks(), vous allez répéter les deux étapes que nous venons d’examiner. Rappelez-vous, nous ne pouvons le faire que parce que nous avions auparavant requis notre fichier de classe pour Plugin_Name_Alert.

1. Instanciez un objet de votre classe:

$plugin_alert = new Plugin_Name_Alert();

2. Utilisez la fonction add_action() du chargeur pour associer une fonction de $plugin_alert:

$this->loader->add_action( 'init', $plugin_alert, 'my_alert_function' );

C'est tout. Voici une liste de contrôle pour vous assurer que vous avez fait tout ce dont vous avez besoin.


Résumé de la liste de contrôle

0. Créez votre classe. Dans l'exemple ci-dessus, il a été défini comme Plugin_Name_Alert à includes/class-plugin-name-alert.php. Voici une classe très simple que vous pouvez utiliser pour les tests et que nous utiliserons pour afficher un message d'alerte chaque fois que WordPress s'initialise:

<?php

class Plugin_Name_Alert {

    public function my_alert_function() {
        ?> <script>alert("VAE VICTIS!");</script> <?php
    }

}

1. Requiert votre classe dans la fonction load_dependencies(). Cet exemple utilisé: require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-plugin-name-alert.php';

2. Instanciez un objet de votre classe dans la fonction define_public_hooks(). Voici l'exemple:
$plugin_alert = new Plugin_Name_Alert();

3. Enfin, raccordez la fonction de votre classe à et à l'action ou au filtre. Faites ceci dans define_public_hooks(). Voici l'exemple:
$this->loader->add_action( 'init', $plugin_alert, 'my_alert_function' );

4
iyrin