Anonymous functions in WordPress hooks

Using closures has the benefit of keeping the global namespace clean, because you don't have to create a global function first to pass as a callback.

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

Personally I would prefer using closures as callbacks, unless:

  • You want the possibility of removing the callback
  • The callback function needs to be used more then once
  • You need support for older PHP versions (less then 5.3)

Closures in Classes

Closures can also be beneficial within classes.

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

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

Normally callback methods need to be made public, but in this case you can also make them private or protected.

This solution only works for PHP 5.4+. To also make it work for PHP 5.3, you need to explicitly pass the $this object reference to the closure, like:

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

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

The disadvantage of the anonymous function is that you're not able to remove the action with remove_action.

Important: To remove a hook, the $function_to_remove and $priority arguments must match when the hook was added. This goes for both filters and actions. No warning will be given on removal failure.

Because you didn't define function_to_remove, you can't remove it.

So you should never use this inside plugins or themes that somebody else might want to overwrite.