Передача класса, метода и аргументов функциям WordPress - PullRequest
2 голосов
/ 05 августа 2020

При добавлении страниц в админку WordPress вы используете add_menu_page, который принимает вызываемую функцию / метод.

class Foo
{
    public function __construct()
    {
        add_menu_page($page_title, $menu_title, $capability, $menu_slug, [$this, 'bar'], $icon_url, $position);
    }

    public function bar(): void
    {
        echo 'Hello, World!';
    }
}

Моя проблема в том, что я немного озадачен как передать аргумент в bar, когда он принимает / ожидает параметры, например:

class Foo
{
    public function __construct()
    {
        add_menu_page($page_title, $menu_title, $capability, $menu_slug, [$this, 'bar'], $icon_url, $position);
    }

    public function bar(string $name = ''): void
    {
        echo "Hello, {$name}!";
    }
}

Я пробовал несколько разных подходов, но не могу заставить его работать:

[$this, 'bar', 'Bob']; // Warning: call_user_func_array() expects parameter 1 to be a valid callback, array must have exactly two members in /wp-includes/class-wp-hook.php on line 287

[$this, ['bar', 'Bob']] // Warning: call_user_func_array() expects parameter 1 to be a valid callback, second array member is not a valid method in /wp-includes/class-wp-hook.php on line 287

Итак, глядя на строку 287 этого файла, он использует call_user_func_array, и я думаю, что кажется, что можно передать аргумент в параметре $function для add_menu_page, но я просто не могу его понять на работу:

// Avoid the array_slice() if possible.
if ( 0 == $the_['accepted_args'] ) {
    $value = call_user_func( $the_['function'] );
} elseif ( $the_['accepted_args'] >= $num_args ) {
    $value = call_user_func_array( $the_['function'], $args );
} else {
    $value = call_user_func_array( $the_['function'], array_slice( $args, 0, (int) $the_['accepted_args'] ) );
}

Помощь будет признательна!

1 Ответ

1 голос
/ 05 августа 2020

Вместо этого вы должны иметь возможность передать анонимную функцию , тело которой просто вызовет метод bar с соответствующими аргументами.

Анонимная функция будет выглядеть так:

function () { $this->bar('Bob'); }

Или, альтернативно, если вы используете PHP 7.4 +:

fn() => $this->bar('Bob')

Итак, просто передайте это как обратный вызов, например:

add_menu_page(
  $page_title,
  $menu_title,
  $capability,
  $menu_slug,
  // fn() => $this->bar('Bob'),
  function () {  
    $this->bar('Bob');  
  },
  $icon_url,
  $position
);

Примечание: я очень плохо знаком с WordPress, поэтому это может быть не самый подходящий способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...