Вкладки справки с: добавить вкладку справки() обратный вызов - Как работает этот аргумент?


Я просто попытался добавить простую вкладку справки из класса (пример для тестирования ниже). Я хотел использовать fn помощника/обратного вызова для подготовки содержимого для разных вкладок справки. Согласно ядру, функция принимает некоторые аргументы:

WP 3.3/wp-admin/includes/screen.php СТРОКА 722

     // If it exists, fire tab callback.
     if ( ! empty( $tab['callback'] ) )
        call_user_func_array( $tab['callback'], array( $this, $tab ) );

По какой-то причине я получаю полный объект WP_Screen в обратном вызове, а не только вкладку. Смотрите Пастебин здесь.

Вот пример. Для вашего удобство, как плагин, так что тестирование проще (на экранах сообщений).

<?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 является объектом). Я попытался сбросить все части массива без какого-либо результата (белый экран, без ошибок).

Author: kaiser, 2012-05-29

2 answers

Хорошо. Ответ НЕ простой, но после некоторых попыток и ошибок, чтения ядра и т. Д. Я выяснил, в чем проблема:

Обратный вызов (который следует использовать вместо 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
        )

)

ВАЖНАЯ ИНФОРМАЦИЯ: Ты не такой!! (никогда, во всяком случае) разрешено использовать пробелы внутри 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' ) );
 4
Author: kaiser, 2012-05-29 12:45:34

Если вы не знаете, сколько или какие аргументы достигают вашего обратного вызова, попробуйте эти две полезные функции php:

func_num_args()

И

func_get_args()

Первый показывает, сколько аргументов отправляется. Второй дает вам массив с аргументами.

public function prepare(){

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

}
 1
Author: Ralf912, 2012-05-30 00:00:52