Demasiados pocos argumentos en la función WP_Widget::__construct()
Primera vez con un widget personalizado. Estoy intentando crearlo de esta manera:
<?php
namespace App;
class My_Widget extends \WP_Widget {
function My_Widget() {
$widget_ops = [
'name' => 'Mi widget',
'description' => 'Mi descripción'
];
parent::__construct( 'My_Widget', 'Mi widget', $widget_ops );
}
}
function load_widget() {
register_widget( 'App\\my_widget' );
}
add_action( 'widgets_init', __NAMESPACE__ . '\\load_widget' );
Y obtengo este error:
Too few arguments to function WP_Widget::__construct(), 0 passed in /srv/www/contraindicaciones.net/current/web/wp/wp-includes/class-wp-widget-factory.php on line 61 and at least 2 expected
¿Qué estoy haciendo mal? ¡Gracias!

Estás utilizando un método extremadamente obsoleto para crear un widget. Deberías usar la función __construct()
, no una función con nombre, como constructor, como está documentado.
namespace App;
class My_Widget extends \WP_Widget {
function __construct() {
$widget_ops = [
'name' => 'My widget',
'description' => 'My description'
];
parent::__construct( 'My_Widget', 'My widget', $widget_ops );
}
}
function load_widget() {
register_widget( 'App\\my_widget' );
}
add_action( 'widgets_init', __NAMESPACE__ . '\\load_widget' );

¡Gracias! Funciona. Aquí en el codex permanece el método antiguo como ejemplo: https://codex.wordpress.org/es:API_de_Widget#Desarrollando_Widgets.

Desafortunadamente parece que la documentación en español en el codex está extremadamente desactualizada. Usa developer.wordpress.org si puedes (no pude averiguar cómo comprobar si hay traducciones decentes al español).

Esto es fantástico y resolvió mi configuración - ahora funcionando en PHP8. ¡Muchas gracias!

Mi conclusión: 1. No copies la firma del constructor padre (es decir, ($id_base, $name, $widget_options = array(), $control_options = array())
). 2. Usa un constructor sin parámetros (es decir, __construct()
) pero 3. llama al constructor del padre con argumentos (por ejemplo, parent::__construct( 'My_Widget', 'Mi widget', ...
).
