pinkcrab/hook-loader

WordPress 的基于对象的钩子加载器。


README

PinkCrab 钩子 Hook_Loader。

alt text Open Source Love codecov

更多详细信息请访问我们的文档。 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。