Попытка использовать добавить действие и выполнить действие с параметрами


В моих темах 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);
Author: sogathon, 2015-01-15

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;
    }
} );
 12
Author: cybmeta, 2017-04-13 12:37:35