Funciones anónimas en los ganchos de WordPress

Los ganchos de WordPress se pueden usar de dos maneras:

  1. usar el nombre de la función de callback y la función apropiada

    add_action( 'action_name', 'callback_function_name' ); function callback_function_name() { // do something } 
  2. usando la función anónima (cierre)

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

¿Hay alguna diferencia para WordPress qué manera de usar? ¿Qué es lo que se prefiere y por qué?

La desventaja de la función anónima es que no puede eliminar la acción con remove_action .

Importante: Para eliminar un enlace, los argumentos $function_to_remove y $priority deben coincidir cuando se agregó el enlace. Esto aplica para filtros y acciones. No se dará ninguna advertencia sobre la falla de eliminación.

Como no definió function_to_remove , no puede eliminarlo.

Por lo tanto, nunca debe usar estos plugins o temas internos que alguien más quiera sobrescribir.

El uso de cierres tiene la ventaja de mantener limpio el espacio de nombres global , ya que no es necesario crear primero una función global para pasarla como una callback.

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

Personalmente, preferiría utilizar cierres como devoluciones de llamadas, a menos que :

  • Desea la posibilidad de eliminar la callback
  • La función de callback debe usarse más de una vez
  • Necesita soporte para versiones anteriores de PHP (menos de 5.3)

Cierres en clases

Los cierres también pueden ser beneficiosos dentro de las clases .

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

Normalmente, los métodos de callback deben hacerse públicos , pero en este caso también puede hacerlos privados o protegidos .

Esta solución solo funciona para PHP 5.4+. Para que también funcione para PHP 5.3, debe pasar explícitamente la referencia $this object al cierre, como:

  public function __construct() { $self = $this; add_action('wp_head', function () use ($self) { $self->addSomeStyling(); }); }