dashifen/wp-handler

一个对象,用于使用受保护方法定义各种WordPress动作和过滤器钩子的处理器。

安装次数: 4,434

依赖关系: 5

建议者: 0

安全: 0

星星: 20

关注者: 3

分支: 3

开放问题: 1

类型:项目

11.0.7 2024-03-28 14:45 UTC

README

此对象是隐藏将处理器附加到WordPress动作和过滤器钩子到对象内的protected方法的具体细节的一种方式。没有它,只有对象的public方法可以访问WordPress核心生态系统,但有了它,我们也可以使用protected方法。

等等!Protected方法可用在WordPress中?没错!

通过反射和__call()方法,此库中的类允许,但不强制,您使用protected方法作为动作/过滤器回调。虽然这明显违反了关于对象方法可见性的“法律条文”,但这是一种为我们的对象添加额外安全层的好方法。如果public方法是进入对象作用域的未锁之门,那么这些方法是锁着的。有了正确的钥匙,WordPress可以解锁它们并进入,但其他插件、主题或甚至没有正确钥匙的WP核心将无法进入。

安装

此包已准备好使用composer,只需...

composer install dashifen/wp-handler

...然后开始工作!

使用

此库包含一系列嵌套的对象,它们协同工作以在您的代码中提供越来越多的WordPress特定性。已提供接口,但也提供了我们预期将更有用的abstract对象。

AbstractHandler

在这个层次结构的顶部是简单的AbstractHandler对象。它定义了一组核心功能,它的每个扩展都以某种方式使用。有关更多信息,请参阅其接口。此外,在此对象内部还有许多受保护的方法,您应使用这些方法向项目生态系统添加和删除WordPress动作和过滤器回调。以下是一些示例。

AbstractThemeHandler

这是一个主题对象应该扩展的对象。它添加了三个方法——前两个是public的,最后一个是protected的:getStylesheetDirgetStylesheetUrlenqueue。前两个方法相对容易理解;最后一个方法将主题目录中找到的JS和CSS排队,而不必经过我们通常执行的操作。

AbstractPluginHandler

与主题处理器一样,从这里可以扩展插件。它比主题处理器更健壮,提供目录和URL识别辅助,并将enqueue方法扩展到从插件的作用域添加JS和CSS。但是,它还具有激活、停用和卸载您的插件以及一些用于方便您的控制面板菜单操作的功能。

代理

处理器有自己的代理来为他们执行特定任务,否则他们必须亲自执行。因此,代理是小型、专注的类,负责处理处理器所使用的特定单一职责。例如,帖子类型注册,特别是WordPress register_post_type函数的标签数组相当冗长。将它们移到服务对象中可以使您的插件或主题对象更整洁,使您的生命更美好,可能有助于维护。有类型注册问题?您将知道在哪里查找!

已经定义了三个抽象的Agent对象:一个通用的AbstractAgent,然后是方便您的AbstractPluginAgentAbstractThemeAgent

钩子

使用受保护方法的回调必须使用AbstractHandleraddActionaddFilter方法进行注册。这些方法反过来构建HookInterface对象,用于“记住”WordPress需要解锁这些方法所代表的门的密钥。目前,这个密钥是WordPress调用您的方法和执行的action或filter钩子的优先级级别。在确保WP在正确的时间、地点以及预期的信息量调用您的回调时,添加参数计数是下一步合理的步骤。

如果需要更改插件或主题使用的钩子类型,提供了一个HookFactoryInterface。只需实现它来创建您的工厂,该工厂产生您类型的钩子,在构造处理器时,只需将您的工厂作为构造函数的参数提供即可。

MenuItemInterface

对于插件处理器的菜单操作方法,包含了一系列表示菜单项的对象。它们使用我的仓库对象,允许以类似这些对象提供有限访问受保护方法的方式只读访问受保护属性。这是这些对象的新功能,我不确定我对它们的最终结果是否完全满意。欢迎提出建议!

示例

class AwesomePlugin extends AbstractPluginHandler {
    public function initialize (): void {
      if (!$this->isInitialized()) {
        $this->addAction("init", "startSession");
      }
    }

    protected function startSession (): void {
      if (session_status() !== PHP_SESSION_ACTIVE) {
        session_start();
      } 
    }

在上面的示例中,我们创建了一个非常小的插件对象。由于父类的initialize方法是抽象的,我们必须在这里实现它。注意,我们在其中调用isInitialized方法;如果此方法返回false,则它将不再这样做。这是为了避免任何处理器意外重新初始化其回调的可能性。建议您在使用这些对象时遵循此模式。

然后,我们添加了一个单个的操作回调:当WordPress初始化时,我们想要启动一个PHP会话。为什么?谁知道!这只是一个例子 😅。

通过使用处理器的addAction方法,我们构建了一个“记住”我们回调并跟踪WordPress将需要解锁我们门的密钥的Hook对象。因此,当WordPress在init动作的优先级10(默认值)时来敲门时,处理器的__call魔术方法检查其“密钥”,确定它符合我们的锁,然后让它进来执行startSession方法。

class AwesomeTheme extends AbstractThemeHandler {
    public function initialize (): void {
      if (!$this->isInitialized()) {
        $this->addAction("wp_enqueue_scripts", "enqueueAssets");
      }
    }

    protected function addAssets (): void {
       $this->enqueue("//fonts.googleapis.com/css?family=Iceland:400,700|Droid+Sans:400,700|Droid+Serif:400italic,700italic");
       $this->enqueue("assets/dashifen.css");
       $this->enqueue("assets/dashifen.js");
    }

这不是一股清新的空气吗?enqueue方法足够聪明,知道由于地址前的//,Google字体位于线上的其他地方。其他两个将不会包含在主题目录的资产文件夹中,我们不需要做这项工作来识别该主题的目录等,因为这项工作已经在AbstractThemeHandler对象中完成了。

注意:我们处理器函数排队的资产将资产文件的最后修改日期作为WordPress排序列表的第四个参数。我们希望这对于缓存破坏 purposes 有用,因为CSS或JS文件的新版本必然会有新的修改日期。

版本11

版本11将支持PHP 8。其他预期的更改如下

  1. 从本包的命名空间中删除CaseChangingTrait

来源

我为在弗吉尼亚州亚历山大市的Engage工作时使用这个对象而编写。他们已给予我复制并更改它以供自己使用的许可,这就是这个仓库。他们的副本是初始提交到这个仓库的,我认为我们都不会保证,经过一段时间后,它们将是可互换的。