pinkcrab / hook-loader
WordPress 的基于对象的钩子加载器。
Requires
- php: >=7.1.0
Requires (Dev)
- dealerdirect/phpcodesniffer-composer-installer: *
- gin0115/wpunit-helpers: ^1.0
- object-calisthenics/phpcs-calisthenics-rules: *
- php-stubs/wordpress-stubs: ^6.0 || ^5.9
- phpstan/phpstan: ^1.0
- phpunit/phpunit: ^7.0 || ^8.0
- roots/wordpress: ^6.0
- symfony/var-dumper: 4.*
- szepeviktor/phpstan-wordpress: ^1.0
- wp-coding-standards/wpcs: *
- wp-phpunit/wp-phpunit: ^6.0
- yoast/phpunit-polyfills: ^0.2.0 || ^1.0.0
This package is auto-updated.
Last update: 2024-09-07 17:28:52 UTC
README
PinkCrab 钩子 Hook_Loader。
更多详细信息请访问我们的文档。 https://perique.info/lib/Hook_Loader.html
版本
发布 1.2.0
从 v1.0.0 开始,我们对内部工作进行了修改,将主要类名从 Loader 更改为 Hook_Loader,但 Loader 作为旧版本的填充保留。
为什么?
WordPress,尤其是 WooCommerce,都是围绕钩子构建的,如果你需要注册很多钩子,跟踪它们可能会有点困难,并且难以跟踪当前正在注册的内容。
PinkCrab Hook_Loader 提供了一种更易于管理的注册和删除钩子调用、简码和 AJAX 调用的方法。
设置
$ composer require pinkcrab/hook-loader
一旦安装了钩子加载器,就可以使用它。由于所有这些都被视为一个类,因此可以将实例作为依赖项传递给任何希望访问加载器的类。
注册钩子(操作和过滤器)
Hook_Loader::action(string $hook, callable $method, int $priority=10, int $args = 1): void
Hook_Loader::admin_action(string $hook, callable $method, int $priority=10, int $args = 1): void
Hook_Loader::front_action(string $hook, callable $method, int $priority=10, int $args = 1): void
Hook_Loader::filter(string $hook, callable $method, int $priority=10, int $args = 1): void
Hook_Loader::admin_filter(string $hook, callable $method, int $priority=10, int $args = 1): void
Hook_Loader::front_filter(string $hook, callable $method, int $priority=10, int $args = 1): void
$loader = new Hook_Loader(); // Add actions $loader->action('some_action', 'my_callback'); // Registered front and admin $loader->front_action('some_action', 'my_callback'); // Frontend only $loader->admin_action('some_action', 'my_callback'); // Admin only // Filters $loader->filter('some_filter', 'strtolower'); // Registered front and admin $loader->front_filter('some_filter', 'strtolower'); // Frontend only $loader->admin_filter('some_filter', 'strtolower'); // Admin only // Remove hooks $loader->remove('some_action', 'someone_else_callback', 10); $loader->remove_filter('some_action', 'someone_else_callback', 10); // Does the same as remove() $loader->remove_action('some_action', 'someone_else_callback', 10); // Does the same as remove() // Ajax and Shortcode. $loader->shortcode('my_shortcode', 'shortcode_callback'); $loader->ajax('my_action', 'my_callback', true, true); // Once all have been added, just process with $loader->register_hooks();
在类中使用。
class SomeAction{ /** * Register all hooks for this class * @param Hook_Loader $loader * @return void */ public function hooks(Hook_Loader $loader){ $loader->action('action_handle', [$this, 'some_method')], 20); } // The callback public function some_method(){ print 'I WAS CALLED'; } } // In your code, just pass the loader to this class. $loader = new Hook_Loader(); $some_action = new SomeAction(); // Add all the some_action hooks to loader and register them. $some_action->hooks($loader); $loader->register_hooks();
删除钩子(操作和过滤器)
Hook_Loader::remove(string $hook, callable $method, int $priority=10): void
Hook_Loader::remove_filter(string $hook, callable $method, int $priority=10): void
Hook_Loader::remove_hook(string $hook, callable $method, int $priority=10): void
虽然 remove_action() 和 remove_filter() 在 90% 的情况下非常合适,但在将钩子添加到类实例时,取消设置钩子可能会有点棘手,你不能回溯相同的实例。我们的 Hook_Removal 类将手动删除基于类名(实例或静态使用)的所有钩子,允许删除由其他插件创建的钩子。
即使钩子是通过类实例添加的,你只需使用类名来添加方法即可。这允许避免重新创建类的实例,并可能重新运行其他钩子和设置程序。
// The above hook can be removed using // Just the full class name (doesnt run autload) $loader->remove('action_handle', [SomeAction::class, 'some_method'], 20); // Or as a new instance $loader->remove('action_handle', [new SomeAction(), 'some_method'], 20);
简码
Hook_Loader::shortcode(string $hook, callable $method): void
您可以使用加载器轻松添加简码,这不仅确保了它们后面有完整填充的对象。
// Simple example $loader->shortcode( 'testShortCode', function( $atts ) { echo $atts['text']; } ); // Called with shortcode as normal (either in php or wp-admin text input) do_shortcode( "[testShortCode text='yes']" ); // yes // Part of a class class ShortCode { protected $some_service; public function __construct(Some_Service $some_service){ $this->some_service = $some_service; } public function register(Hook_Loader $loader){ $loader->shortcode('my_shortcode', [$this, ['render_shortcode']]); } public function render_shortcode(array $args){ print $this->some_service->do_something($args['something']); } }
AJAX
Hook_Loader::ajax(string $hook, callable $method, bool $public, bool $private): void
如果您想注册 AJAX 调用,则需要 2 个钩子调用。如果您设置多个调用,这很快就会变得混乱。Hook_Loader 可以通过单个声明来处理注册这些调用之一或两者。
$loader->ajax('my_action', 'my_callback', true, true); // For both logged in and out users. $loader->ajax('my_action', 'my_callback', false, true); // For only logged in users. $loader->ajax('my_action', 'my_callback', true, false); // For only logged out users.
与其他示例一样,这可以用于类的一部分来创建自包含的 AJAX 调用。虽然这可以手动完成,但 Registerables 包提供了一个非常有用的 AJAX 抽象类,可以用于此目的。
过滤钩子
在注册之前可以访问钩子集合,这允许过滤钩子。
您可以使用 Hook_Collection 类常量
Hook_Collection::REGISTER_HOOKS
或其字面字符串值pinkcrab/loader/register_hooks
add_filter(Hook_Collection::REGISTER_HOOKS, function($hooks){ // Do something with the hooks return $hooks; });
许可证
MIT 许可证
https://open-source.org.cn/licenses/mit-license.html
变更日志
- 1.2.0 - 更新了测试依赖,支持php8,增加在注册前过滤钩子的功能。
- 1.1.2 - Loader::class 现已标记为过时
- 1.1.1 - register_hooks() 函数中存在拼写错误(应为regster_hooks)
- 1.1.0 - 所有内部功能已迁移,仍然具有相同的功能
- 1.0.2 - 修复了 Hook_Loader_Collection::pop() 上的错误文档注释,并添加了短代码和ajax的缺失readme条目。
- 1.0.1 - 向钩子集合中添加了 pop() 和 count() 方法。实际上并未在外部使用,仅在测试中使用。
- 1.0.0 - 从 Plugin Core 包迁移。将内部集合移动到自己的对象中,远离 PC Collection。