web-dev-qa-db-fra.com

Fonctions anonymes dans WordPress hooks

Les crochets WordPress peuvent être utilisés de deux manières:

  1. en utilisant le nom de la fonction de rappel et la fonction appropriée

    add_action( 'action_name', 'callback_function_name' );
    function callback_function_name() {
        // do something
    }
    
  2. en utilisant une fonction anonyme (fermeture)

    add_action( 'action_name', function() {
        // do something
    } );
    

Y a-t-il une différence pour WordPress quelle manière utiliser? Quelle est la manière préférée et pourquoi?

28
Aleksandr Levashov

L'inconvénient de la fonction anonyme est que vous ne pouvez pas supprimer l'action avec remove_action .

Important: pour retirer un crochet, le $function_to_remove et $priority les arguments doivent correspondre lorsque le hook a été ajouté. Cela vaut pour les filtres et les actions. Aucun avertissement ne sera donné en cas d'échec de la suppression.

Parce que vous n'avez pas défini function_to_remove, vous ne pouvez pas le supprimer.

Vous ne devez donc jamais utiliser ces plugins ou thèmes à l'intérieur que quelqu'un d'autre pourrait vouloir écraser.

31
TeeDeJee

L'utilisation de fermetures a l'avantage de en gardant l'espace de noms global propre, car vous n'avez pas besoin de créer d'abord une fonction globale pour passer en rappel.

add_action('admin_init', function () {
    // some code...
});

Personnellement, je préférerais utiliser des fermetures comme rappels, sauf:

  • Vous voulez la possibilité de supprimer le rappel
  • La fonction de rappel doit être utilisée plus d'une fois
  • Vous avez besoin de support pour les anciennes versions PHP (moins de 5.3))

Fermetures en cours

Les fermetures peuvent également être bénéfiques au sein des classes.

class SomeClass
{
    public function __construct()
    {
        add_action('wp_head', function () {
            $this->addSomeStyling();
        });
    }

    protected function addSomeStyling()
    {
        echo '<style> body { color: #999; } </style>';
    }
}

Normalement, les méthodes de rappel doivent être rendues publiques , mais dans ce cas, vous pouvez également les rendre privées ou protégé .

Cette solution ne fonctionne que pour PHP 5.4+. Pour le faire également fonctionner pour PHP 5.3, vous devez passer explicitement le $this référence d'objet à la fermeture, comme:

    public function __construct()
    {
        $self = $this;

        add_action('wp_head', function () use ($self) {
            $self->addSomeStyling();
        });
    }
15
Victor