Les crochets WordPress peuvent être utilisés de deux manières:
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
}
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?
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.
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:
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();
});
}