Попытка использовать добавить действие и выполнить действие с параметрами
В моих темах functions.php Я пытаюсь добавить функцию с параметрами (в качестве теста, если это работает, а не для функциональности), и она просто не работает.
Параметры всегда приходят пустыми, даже если я вызываю do_action с параметрами, поставленными в очередь, как предложено на этой странице кодекса .
function alter_item ($user, $items, $action) {
global $current_user, $menu;
get_currentuserinfo();
switch ($action) {
case false:
if ($current_user->user_login == $user) {
remove_menu_page ($items);
}
break;
case true:
if ($current_user->user_login == $user) {
remove_menu_page ($items);
}
break;
}
}
add_action( 'admin_menu', 'alter_item', 10, 3 );
do_action('alter_item', 'my-user', 'plugins.php', false);
1 answers
Вы неправильно его используете.
add_action
: прикрепляет функцию к крючку действия. В своем коде вы прикрепляете функциюalter_item
к крючку действияadmin_menu
. Итак, когда происходит действиеadmin_menu
, выполняется функцияalter_item
. Согласно кодексу, никакие параметры не передаются функциям, присоединенным кadmin_menu
. Таким образом, параметры, которые вы пытаетесь использовать вalter_item
, недопустимы.do_action
: вызывает все функции, прикрепленные к крючку действия. В своем коде вы вызов всех функций, прикрепленных к крючку действияalter_item
.alter_item
крючок действия будет пользовательским крючком действия, так как его нет в ядре WP, но в настоящее время в вашем коде к этому действию прикреплено ноль функций, поэтому с вашимdo_action('alter_item'...
.
Правильный способ прикрепления функции к admin_menu
:
function alter_item() {
//Do whatever you want
}
//The priority argument (10 the code bellow) is optional.
add_action( 'admin_menu', 'alter_item', 10 );
Правильный способ определения пользовательских действий:
do_action('alter_item', 'my-user', 'plugins.php', false);
Затем вы можете прикрепить функции к действию alter_item
следующим образом:
add_action( 'alter_item', 'alter_item_attached_function', 10, 3 );
function alter_item_attached_function( $user, $items, $action ) {
//Now $user, $items and $action will be 'my-user', 'plugins.php' and false
}
Если вы хотите пройти информацию для основных действий вы можете:
- используйте допустимые параметры для каждого действия. Обратитесь к официальной документации по каждому действию.
- определите глобальные переменные, используйте параметры, переходные процессы или свойства/методы пользовательских объектов, чтобы вы могли использовать эту информацию в разных местах вашего кода. Пример.
- Используйте анонимные функции PHP с ключевым словом
use
.
Пример использования ключевого слова use
:
$user = 'my-user';
$items = 'plugins.php';
$action = false;
add_action( 'admin_menu', function() use ($user, $items, $action) {
global $current_user, $menu;
get_currentuserinfo();
switch ($action) {
case false:
if ($current_user->user_login == $user) {
remove_menu_page ($items);
}
break;
case true:
if ($current_user->user_login == $user) {
remove_menu_page ($items);
}
break;
}
} );