An Acorn package for WordPress Hook Registration.
- Register Hooks using php attributes
- Configure Hook registration using a config file
- Load plugin-specific hooks only when the plugin is active
See config for all configuration options.
-
Install this package with Composer:
composer require yard/wp-hook-registrar
-
Run the Acorn WP-CLI command to discover this package:
wp acorn package:discover
-
Publish the config file with:
wp acorn vendor:publish --provider="Yard\Hook\HookServiceProvider"
-
Register all your project hooks in the published configuration file
config/hooks.php
.
To use this package in a standard WordPress plugin, you can use the HookRegistrar
to register hooks.
You can skip step 3 and 4 from the installation instructions above and instead add the following to your plugin's
main file:
/**
* Plugin Name: My Plugin
*/
require __DIR__ . '/vendor/autoload.php';
$classNames = [
\Plugin\ClassContainsHooks::class,
\Plugin\AnotherClassContainsHooks::class,
];
$registrar = new \Yard\Hook\Registrar($classNames);
$registrar->registerHooks();
This package provides two Attributes: Action
and Filter
. They can be used to register hooks instead of the
WordPress functions add_action() and add_filter()
This syntax allows you to place the hook registration directly above the method it invokes when the hook is triggered.
#[Action(string $hookName, int $priority = 10)]
public function doSomething(): void
#[Filter(string $hookName, int $priority = 10)]
public function filterSomething(): mixed
Notice that you do not need to pass the number of accepted arguments to the Action
and Filter
attributes as you would
with add_action()
and add_filter()
. Instead, the number of accepted arguments is determined by the method
signature.
You can add as many hooks to the same method as you want.
<?php
namespace App\Hooks;
use Yard\Hook\Action;
use Yard\Hook\Filter;
class Theme
{
#[Action('save_post')]
public function doSomething(int $postId, \WP_Post $post, bool $update): string
{
// do something
}
#[Filter('the_content')]
#[Filter('the_excerpt')]
public function filterSomething(string $content)
{
// filter content
return $content;
}
}