通过操作筛选器使类可用

时间:2013-09-08 作者:Twifty

我正在创建一个显示选项卡式视图的插件。当前的工作方式是当用户单击选项卡时class Loader 读取$_GET 参数,并创建特定于该选项卡内容的类的实例。现在我已经完成了这项工作,我希望能够将此插件的功能扩展到其他插件。ie,我希望另一个插件能够创建一个新的选项卡类型。虽然我可以使用if_method_exists().

如何使第二个插件中的实例或类名可用于我的插件?

我想要实现的是Loader 类以提供一个类名列表,它可以首先从中填充选项卡,然后在选择该选项卡时创建实例。

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

构建某种注册表,其他插件可以在其中注册新选项卡。假设插件的管理页面处理程序被调用Main_Controller:

class Main_Controller {

    protected $tabs;

    public function __construct()
    {
        $this->tabs = new Tab_List;

        do_action( \'register_tabs\', $this->tabs );
    }

    public function create_tabs() {
        $all_tabs = $this->tabs->get_tabs();

        if ( empty ( $all_tabs ) )
            return;

        foreach ( $all_tabs as $id => $tab ) {
            // print the tab
        }
    }
}
Tab_List 是包含所有已注册选项卡的列表:

class Tab_List {

    protected $tabs = array();

    public function register( $id, Tab $tab ) {
        $this->tabs[ $id ] = $tab;
    }

    public function get_tabs() {
        return $this->tabs;
    }
}
方法register 需要一个定义良好的类实例Tab:

class Tab {

    // Have to be replaced.
    protected $properties = array(
        \'tab_title\'        => \'MISSING TAB TITLE\',
        \'page_title\'       => \'MISSING PAGE TITLE\',
        \'content_callback\' => \'__return_false\',
        \'save_callback\'    => \'__return_false\'
    );

    public function __set( $name, $value ) {
        if ( isset ( $this->properties[ $name ] ) )
            $this->properties[ $name ] = $value;
    }

    public function __get( $name ) {
        if ( isset ( $this->properties[ $name ] ) )
            return $this->properties[ $name ];
    }
}
现在,其他插件可以用一个简单的挂钩注册它们的标签:

add_action( \'register_tabs\', function( Tab_List $tab_list )
{
    $data = new My_Color_Data;
    $view = new My_Color_View( $data );

    $my_tab = new Tab;
    $my_tab->tab_title = \'Colors\';
    $my_tab->page_title = \'Set custom colors\';
    $my_tab->content_callback = array( $view, \'print_tab\' );
    $my_tab->save_callback    = array( $data, \'save_tab\' );

    $tab_list->register( \'colors\', $my_tab );
});
课程My_Color_DataMy_Color_View 是自定义的。这要看你的想象了。:)

另请参见:

结束

相关推荐

如何访问调用Apply_Filters()的函数中的变量?

我试图根据调用的函数中的变量是否apply_filters() 等于特定值。该变量不会传递给apply_filters() 参数。这或许可以解释我的意思:// function in wordpress core function get_var_b() { // generating $var_a $var_a = \"a\"; // some code ... $var_b = apply_filters(\'get_var_b\