Al agregar páginas al administrador de WordPress que usa add_menu_page
que 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!
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