Pasar una clase, método y argumentos a las funciones de WordPress

2 minutos de lectura

Al agregar páginas al administrador de WordPress que usa add_menu_pageque acepta una función/método invocable.

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!';
    }
}

Mi problema es que estoy un poco perplejo sobre cómo pasar un argumento a bar cuando acepta/espera parámetros, por ejemplo:

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}!";
    }
}

He intentado un par de enfoques diferentes, pero parece que no puedo hacer que funcione:

[$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

Entonces, mirando la línea 287 de ese archivo, está usando call_user_func_array y creo que parece que es posible pasar un argumento en el $function parámetro de add_menu_page pero simplemente no puedo hacer que funcione:

// 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'] ) );
}

¡La ayuda sería apreciada!

Avatar de usuario de Jeto
Jeto

Debería poder pasar un función anónima en cambio, cuyo cuerpo simplemente llamaría al bar método con los argumentos apropiados.

La función anónima se vería así:

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

O alternativamente, si está usando PHP 7.4+:

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

Entonces, solo pásalo como devolución de llamada, así:

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

Nota: no estoy muy familiarizado con WordPress, por lo que esta podría no ser la forma más adecuada de hacerlo.

  • Perfecto, ni siquiera pensé en pasar una devolución de llamada directamente a través de él de esa manera. Tampoco puedo ver por qué sería inapropiado, ya que todo lo que espera es una función invocable, que es esta. simplemente no me di cuenta $this estaría disponible dentro de la función anónima. ¡Gracias!

    – no.

    5 de agosto de 2020 a las 11:32

¿Ha sido útil esta solución?