如何使用插件样板加载器类来挂钩操作和筛选器?

时间:2017-04-10 作者:iyrin

这个Plugin_Name_Loader 的类别WordPress Plugin Boilerplate 如果您必须从插件中挂钩到WordPress操作或过滤器,则此选项非常有用。原作者汤姆·麦克法林(TomMcFarlin)说:the loader:

该文件的目标是封装钩子的注册,然后在加载插件时的适当时间执行操作和过滤器。

通常需要钩住适当的操作或过滤器,那么如何利用插件样板的loader类并使用它钩住操作和过滤器呢?

1 个回复
最合适的回答,由SO网友:iyrin 整理而成

这个答案假设您对使用类和对象有基本的了解。完整的答案有点长,如果你不耐烦,请跳到底部的检查表摘要。如果你不理解摘要,请阅读并遵循整个答案。

为了理解如何使用加载器,我们应该查看核心插件类的源代码,Plugin_Name 在里面class-plugin-name.php.

这个first block of code 在这个类中声明私有容器$loader:

protected $loader;

接下来,我们看到the construct 功能load_dependenciesdefine_public_hooks() 被称为:

public function __construct() {
    $this->plugin_name = \'plugin-name\';
    $this->version = \'1.0.0\';
    // Our fearless loader is called from within this class object.
    $this->load_dependencies();
    $this->set_locale();
    $this->define_admin_hooks();
    $this->define_public_hooks();
}
在构造之后,我们看到函数load_dependencies() 定义这里是调用插件使用的类的资源文件的地方。我们看到的第一个类资源文件required here is plugin-name-loader.php.

require_once plugin_dir_path( dirname( __FILE__ ) ) . \'includes/class-plugin-name-loader.php\';

执行此操作:

Require any additional class files your plugin relies on within the load_dependencies() function.

例如,如果定义了一个名为Plugin_Name_Alert 在文件中class-plugin-name-alert.php 位于includes 插件的目录,通过将此行添加到load_dependencies():

require_once plugin_dir_path( dirname( __FILE__ ) ) . \'includes/class-plugin-name-alert.php\';

第一步完成了。

继续我们的检查,我们看到at the end 在这个函数中,我们先前声明的容器调用$loader 现在定义为类的新对象Plugin_Name_Loader, 它现在可以这样做,因为在这个函数的前面刚刚需要它:

$this->loader = new Plugin_Name_Loader();

现在让我们跳下来看看define_public_hooks(). 这是之前从构造调用的另一个函数。这是一个整理插件使用的挂钩的好地方。下面是它的外观:

private function define_public_hooks() {
    // Instantiates a new object of the class Plugin_Name_Public.
    $plugin_public = new Plugin_Name_Public( $this->get_plugin_name(), $this->get_version() );
    // This is where the loader\'s add_action hooks the callback function of the class object. 
    $this->loader->add_action( \'wp_enqueue_scripts\', $plugin_public, \'enqueue_styles\' );
    // Another action is passed to the class object.
    $this->loader->add_action( \'wp_enqueue_scripts\', $plugin_public, \'enqueue_scripts\' );
}
你可以看到这里发生了两件重要的事情:

类的对象被实例化。

加载程序的自定义版本add_action() 将对象作为参数接受。

这就是装载机对我们有用的地方。而不是只将钩子和回调函数传递给add_action(), 加载器使用自己的自定义add_action()add_filter() 允许我们传递三个参数的函数:挂钩、类和回调函数。这样它就知道如何在类中找到函数。

虽然它看起来更复杂,但它标准化了addition of hooks 完全地,在这个过程中将他们分成两个不同的组。WordPress插件样板将挂钩拆分为管理员/公共组,但这还不是全部。它以相同的方式拆分所有代码,要求您在公用文件夹中编写面向公共的代码,在admin文件夹中编写面向管理员的代码。

以下是所有the arguments accepted 由加载程序版本add_action():

add_action( $hook, $component, $callback, $priority = 10, $accepted_args = 1 )

虽然有很多方法可以将类函数传递给WordPressadd_action()add_filter(), 这就是如何通过样板文件的加载器完成的。

也要这样做:

在函数中define_public_hooks(), 您将重复刚才检查的两个步骤。请记住,我们只能这样做,因为之前我们需要我们的类文件Plugin_Name_Alert.

1. Instantiate an object of your class:

$plugin_alert = new Plugin_Name_Alert();

2. Use the loader\'s add_action() to hook a function of $plugin_alert:

$this->loader->add_action( \'init\', $plugin_alert, \'my_alert_function\' );

仅此而已。这里有一份清单,以确保你已经完成了你需要做的一切。

检查表摘要0. Create your class. 在上述示例中,定义为Plugin_Name_Alertincludes/class-plugin-name-alert.php. 下面是一个非常简单的类,您可以使用它进行测试,我们将在每次WordPress初始化时显示一条警报消息:

<?php

class Plugin_Name_Alert {

    public function my_alert_function() {
        ?> <script>alert("VAE VICTIS!");</script> <?php
    }

}
1. Require your class within the load_dependencies() function. 使用的示例:require_once plugin_dir_path( dirname( __FILE__ ) ) . \'includes/class-plugin-name-alert.php\';

2. Instantiate an object of your class within the function define_public_hooks(). 例如:
$plugin_alert = new Plugin_Name_Alert();

3. Lastly, hook the function from your class to an action or filter. Do this within define_public_hooks(). 例如:
$this->loader->add_action( \'init\', $plugin_alert, \'my_alert_function\' );

相关推荐

apply_filters to $GLOBALS

我正在使用Pootle页面构建插件构建一个单页网站。使用get\\u page,我在1页上显示每个单独的页面。为了针对Pootle页面生成器内容,我使用以下代码:$content = $GLOBALS[\'Pootle_Page_Builder_Render_Layout\']->panels_render( $page_data->ID ); 当我尝试实现一个像旋转木马这样的插件时,我需要使用一个短代码,但短代码不起作用。为了使短代码有效,我需要使用apply_filters(\'