Вкладки справки с: добавить вкладку справки() обратный вызов - Как работает этот аргумент?
Я просто попытался добавить простую вкладку справки из класса (пример для тестирования ниже). Я хотел использовать 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
является объектом). Я попытался сбросить все части массива без какого-либо результата (белый экран, без ошибок).
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' ) );
Если вы не знаете, сколько или какие аргументы достигают вашего обратного вызова, попробуйте эти две полезные функции php:
func_num_args()
И
func_get_args()
Первый показывает, сколько аргументов отправляется. Второй дает вам массив с аргументами.
public function prepare(){
echo 'Number of arguments: ' . $func_num_args();
echo 'Arguments:';
var_dump( func_get_args() );
}