Слишком мало аргументов для функции WP_Widget::__construct()

21 февр. 2021 г., 16:05:02
Просмотры: 14.5K
Голосов: 5

Первый раз работаю с кастомным виджетом. Пытаюсь создать его таким образом:

<?php
namespace App;

class My_Widget extends \WP_Widget {
    function My_Widget() {

        $widget_ops = [
            'name' => 'Мой виджет',
            'description' => 'Мое описание'
        ];
        parent::__construct( 'My_Widget', 'Мой виджет', $widget_ops );
    }
}

function load_widget() {
    register_widget( 'App\\my_widget' );
}
add_action( 'widgets_init', __NAMESPACE__ . '\\load_widget' );

И получаю такую ошибку:

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

Что я делаю не так? Спасибо!

0
Все ответы на вопрос 1
4
12

Вы используете крайне устаревший метод создания виджета. Вместо именованной функции следует использовать метод __construct() в качестве конструктора, как указано в документации.

namespace App;

class My_Widget extends \WP_Widget {
    function __construct() {

        $widget_ops = [
            'name' => 'Мой виджет',
            'description' => 'Мое описание'
        ];
        parent::__construct( 'My_Widget', 'Мой виджет', $widget_ops );
    }
}

function load_widget() {
    register_widget( 'App\\my_widget' );
}
add_action( 'widgets_init', __NAMESPACE__ . '\\load_widget' );
21 февр. 2021 г. 16:28:35
Комментарии

Спасибо! Это работает. Здесь в codex остался старый метод в качестве примера: https://codex.wordpress.org/es:API_de_Widget#Desarrollando_Widgets.

aitor aitor
21 февр. 2021 г. 16:50:34

К сожалению, похоже, что испанская документация в codex сильно устарела. Используйте developer.wordpress.org, если это возможно (я не смог понять, есть ли там качественные испанские переводы).

Jacob Peattie Jacob Peattie
21 февр. 2021 г. 16:58:01

Это потрясающе и решило мою проблему с настройкой - теперь работает на PHP8. Большое спасибо!

Frank Frank
17 окт. 2021 г. 00:34:39

Мои выводы: 1. Не копировать сигнатуру конструктора родительского класса (т.е. ($id_base, $name, $widget_options = array(), $control_options = array())). 2. Использовать конструктор без параметров (т.е. __construct()), но 3. вызывать конструктор родительского класса с аргументами (например, parent::__construct( 'My_Widget', 'My widget', ...).

twigmac twigmac
30 янв. 2025 г. 14:58:35