帮助选项卡:ADD_HELP_TAB()回调-参数是如何工作的?

时间:2012-05-29 作者:kaiser

我只是尝试在类中添加一个简单的帮助选项卡(下面要测试的示例)。我想使用助手/回调fn为不同的帮助选项卡准备内容。根据core,该函数采用一些参数:

WP 3.3/WP管理/包括/屏幕。php第722行

     // If it exists, fire tab callback.
     if ( ! empty( $tab[\'callback\'] ) )
        call_user_func_array( $tab[\'callback\'], array( $this, $tab ) );
出于某种原因,我得到了WP_Screen 对象,而不仅仅是选项卡。看见PasteBin here.

下面是一个例子。为了您的方便,作为一个插件,测试更容易(在post屏幕上)。

<?php
/**
 * Plugin Name: Help Tab Test Case
 * Plugin URI:  http://unserkaiser.com
 * Description: Add Help Tab test case
 */
class example_help
{
    public $tabs = array(
         \'EXAMPLE\' => array(
             \'title\'   => \'TEST ME!\'
            ,\'content\' => \'FOO\'
         )
    );

   static public function init()
    {
        $class = __CLASS__ ;
        new $class;
    }

    public function __construct()
    {
        add_action( "load-{$GLOBALS[\'pagenow\']}", array( $this, \'add_tabs\' ), 20 );
    }

    public function add_tabs()
    {
        foreach ( $this->tabs as $id => $data )
        {
            get_current_screen()->add_help_tab( array(
                 \'id\'       => $id
                ,\'title\'    => __( $data[\'title\'], \'some_textdomain\' )
                ,\'content\'  => $data[\'content\']
                ,\'callback\' => array( $this, \'prepare\' )
            ) );
        }
    }

    /* HELPER */
    public function prepare( $tab )
    {
error_reporting( E_ALL );
// FAILS: return blank
// _dump( $tab[\'tabs\'] );
// No error output on screen
var_dump( $tab );

// I can dump it using my own function, 
// that adds the data to a global and then calls & prints it on shutdown
// See pastebin for content
// _dump( $tab );
        return printf( 
             \'<p>%s</p>\'
            ,__( \'test\', \'dmb_textdomain\' )
        );
    }
}
add_action( \'load-post.php\', array( \'example_help\', \'init\' ) );
add_action( \'load-post-new.php\', array( \'example_help\', \'init\' ) );
编辑:如果我只是输出print $tab 在回拨中,我得到Array 作为实际内容上方的输出字符串(WP_Screen 是一个对象)。我尝试转储阵列的所有部分,但没有任何结果(白色屏幕,没有错误)。

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

好啊答案是NOT 很简单,但经过一些尝试和错误,阅读core等,我发现了问题所在:

回调(应该使用它来代替content) 接受两个参数:$current_screen$tab.

这里是什么$tab 看起来,当转储为单个选项卡时。

Array
(
    [title] => TEST ME
    [id] => EXAMPLE_A
    [content] => 
    [callback] => Array
        (
            [0] => dmb_help Object
                (
                    [tabs] => Array
                        (
                            [EXAMPLE_A] => Array
                                (
                                    [title] => TEST ME
                                    [content] => FOO
                                )

                            [EXAMPLE_B] => Array
                                (
                                    [title] => TEST ME ALSO
                                    [content] => BAR
                                )

                        )

                )

            [1] => prepare
        )

)
IMPORTANT INFO: 你不是!!(无论如何都不允许)使用id-一串然后可以从对象中获取实际内容:

public function prepare( $screen, $tab )
{
    printf( 
         \'<p>%s</p>\'
        ,__( 
             $tab[\'callback\'][0]->tabs[ $tab[\'id\'] ][\'content\']
            ,\'some_textdomain\' 
         )
    );
}
你应该放弃content 完全在输入数组中(直到在多个帮助选项卡之间循环时不想添加一些重复的内容)。

最后一个工作示例:

这是作为插件的工作文本案例。

<?php
/**
 * Plugin Name: Help Tab Test Case
 * Plugin URI:  http://unserkaiser.com
 * Description: Add Help Tab test case
 */
class example_help
{
    public $tabs = array(
        // The assoc key represents the ID
        // It is NOT allowed to contain spaces
         \'EXAMPLE\' => array(
             \'title\'   => \'TEST ME!\'
            ,\'content\' => \'FOO\'
         )
    );

    static public function init()
    {
        $class = __CLASS__ ;
        new $class;
    }

    public function __construct()
    {
        add_action( "load-{$GLOBALS[\'pagenow\']}", array( $this, \'add_tabs\' ), 20 );
    }

    public function add_tabs()
    {
        foreach ( $this->tabs as $id => $data )
        {
            get_current_screen()->add_help_tab( array(
                 \'id\'       => $id
                ,\'title\'    => __( $data[\'title\'], \'some_textdomain\' )
                // Use the content only if you want to add something
                // static on every help tab. Example: Another title inside the tab
                ,\'content\'  => \'<p>Some stuff that stays above every help text</p>\'
                ,\'callback\' => array( $this, \'prepare\' )
            ) );
        }
    }

    public function prepare( $screen, $tab )
        {
            printf( 
             \'<p>%s</p>\'
            ,__( 
                     $tab[\'callback\'][0]->tabs[ $tab[\'id\'] ][\'content\']
                ,\'dmb_textdomain\' 
             )
        );
    }
}
// Always add help tabs during "load-{$GLOBALS[\'pagenow\'}".
// There\'re some edge cases, as for example on reading options screen, your
// Help Tabs get loaded before the built in tabs. This seems to be a core error.
add_action( \'load-post.php\', array( \'example_help\', \'init\' ) );
add_action( \'load-post-new.php\', array( \'example_help\', \'init\' ) );

SO网友:Ralf912

如果您不知道有多少或什么类型的参数到达回调,请尝试以下两个有用的php函数:

func_num_args()
以及

func_get_args()
第一个显示发送了多少个参数。第二个为您提供一个包含参数的数组。

public function prepare(){

   echo \'Number of arguments: \' . $func_num_args();
   echo \'Arguments:\';
   var_dump( func_get_args() );

}

结束

相关推荐