Demasiados pocos argumentos en la función WP_Widget::__construct()

21 feb 2021, 16:05:02
Vistas: 14.5K
Votos: 5

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!

0
Todas las respuestas a la pregunta 1
4
12

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' );
21 feb 2021 16:28:35
Comentarios

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

aitor aitor
21 feb 2021 16:50:34

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).

Jacob Peattie Jacob Peattie
21 feb 2021 16:58:01

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

Frank Frank
17 oct 2021 00:34:39

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', ...).

twigmac twigmac
30 ene 2025 14:58:35