Errores fatales en class-wp-widget.php de WordPress 6.0 en PHP 8.1.6
/wp-includes/class-wp-widget.php me da un error en un blog, pero no en el otro, y ambos tienen la misma versión de class-wp-widget.php, lo cual no tiene sentido para mí.
PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function WP_Widget::__construct(), 0 passed in /home/www/stackexchange.com/wp-includes/class-wp-widget-factory.php on line 61 and at least 2 expected in /home/www/stackexchange.com/wp-includes/class-wp-widget.php:162
Leyendo el código, parece que class-wp-widget.php es la raíz del problema, pero podría estar equivocado.
Mi otro blog (que funciona) en el mismo servidor tiene este mismo archivo y no obtengo el error.
Puedes ver la función de WordPress rota aquí https://developer.wordpress.org/reference/classes/wp_widget/__construct/
¿Hay alguna manera de "desactivar" los widgets para desactivar este código de WordPress roto?
Actualización: gracias @bosco por la idea, mirando el Stack trace ayudó...
Stack trace:
#0 /home/www/example.com/wp-includes/class-wp-widget-factory.php(61): WP_Widget->__construct()
#1 /home/www/example.com/wp-includes/widgets.php(115): WP_Widget_Factory->register()
#2 /home/www/example.com/wp-content/themes/theme1516/includes/register-widgets.php(22): register_widget()
#3 /home/www/example.com/wp-includes/class-wp-hook.php(307): load_my_widgets()
#4 /home/www/example.com/wp-includes/class-wp-hook.php(331): WP_Hook->apply_filters()
#5 /home/www/example.com/wp-includes/plugin.php(476): WP_Hook->do_action()
#6 /home/www/example.com/wp-includes/widgets.php(1854)
Dado que "register-widgets.php" es el único código no principal aquí, y porque asumo que el comentario de @bosco es correcto, comenté los widgets antiguos y eso al menos eliminó la "pantalla blanca de la muerte". Mientras tanto la página de inicio se ve extraña, probablemente solo copiaré y pegaré el HTML del sitio con PHP 7.x.
En caso de que no puedas revertir a una versión de PHP anterior a la 8.1 o solucionar el registro del widget (y confías en tu tema de más de 10 años), puedes actualizar la línea 61 del archivo wp-includes/class-wp-widget-factory.php
de esta manera:
$this->widgets[ $widget ] = new $widget( $widget, $widget );
Esto podría solucionar el problema de registro del widget.

Este era exactamente mi problema también y este cambio de código lo resolvió para mí. ¡Muchas gracias por esto!

¡Eso fue increíble! Después de hacer ese pequeño cambio pude iniciar WordPress y luego desactivar fácilmente el plugin problemático. Luego pude cambiar el código de nuevo al código predeterminado de WordPress ($this->widgets[ $widget ] = new $widget()
), y el sitio web sigue funcionando. ¡Muchísimas gracias!

Sospecho que la causa es un widget personalizado que ha sido construido incorrectamente. Mira este ejemplo del Codex:
class My_Widget extends WP_Widget {
/**
* Configura el nombre del widget, etc.
*/
public function __construct() {
$widget_ops = array(
'classname' => 'my_widget',
'description' => 'Mi Widget es increíble',
);
parent::__construct( 'my_widget', 'Mi Widget', $widget_ops );
}
Lo que hacen muchos plugins mal construidos es esto:
class My_Widget extends WP_Widget {
/**
* Configura el nombre del widget, etc.
*/
public function __construct() {
parent::__construct();
}
¡O incluso no incluyen un método __construct
en absoluto! No pasar parámetros o no tener un constructor es incorrecto. Versiones anteriores de PHP pueden haber sustituido estos valores por null
o undefined
, resolviendo a ''
, pero aún así habría esperado que esto se convirtiera en un problema antes de actualizar a 8.1, y ciertamente habría aparecido en el registro de errores como un aviso.
Así que identifica qué plugin o tema es responsable de esto, ya sea con trazas de pila, un proceso de eliminación, o incluso haciendo una búsqueda en el código base con una herramienta.
Si esto está en código que mantienes, como un tema o plugin personalizado, puedes resolver el problema implementando correctamente la API de Widgets como indican el Codex y los manuales de DevHub. Específicamente, proporcionando los dos primeros parámetros.
Si no estás interesado en arreglar los widgets, también puedes eliminarlos completamente de tu sitio.
Mientras tanto, vuelve a la versión 8.0 por un tiempo. Tanto 8.0 como 8.1 son versiones soportadas actualmente de PHP y están recibiendo actualizaciones. WordPress aún no ha construido soporte oficial para 8.0, y 8.1 es una versión muy reciente (principios de 2022), así que no es sorprendente que hayas encontrado problemas de compatibilidad y choques con código de terceros al actualizar.

Aunque agradezco el esfuerzo, esta respuesta se parece a otras que encontré en Google. En mi caso particular, no estoy usando los widgets, solo se incluyeron como extras en el tema, y no tengo ningún deseo de arreglar una docena de widgets antiguos de hace más de 10 años. En cuanto a PHP 8.x, tengo dos blogs de prueba funcionando bien en Arch, por cierto ;-)

si usaste o no los widgets es irrelevante para el problema (yo ejecuto mi propio sitio en 8.0). Si no tienes intención de usar los widgets y no quieres arreglarlos, entonces deberías eliminarlos. El problema no es WordPress, es código de terceros que hace un uso incorrecto de la API generando errores.

Para decirlo de otra manera, cuando tu código escrito para depender de una biblioteca hecha para el estándar C++ 98 no compila al actualizar tu código al estándar C++ 20, no es en absoluto culpa del Comité/Grupo de Trabajo de C++ - estás intentando usar una biblioteca que alguien escribió hace más de 20 años y nunca actualizó en una plataforma que nunca fue construida para facilitarlo. WordPress tiene una convicción molesta cuando se trata de compatibilidad con versiones anteriores - pero los cambios disruptivos son buenos para la salud y el desarrollo de cualquier tecnología.

Mientras que en este caso el Widget fue construido incorrectamente desde el primer día

Para cualquiera que aún tenga este problema, puedes intentar ir a
wordpress/wp-includes/class-wp-widget-factory.php
en la línea 61 y hacer este cambio para solucionar el problema sin modificar ningún otro código:
Cambia esto: $this->widgets[ $widget ] = new $widget();
Por esto: $this->widgets[ $widget ] = new $widget( $widget, $widget );
Ahora todo debería funcionar como se espera.

Sin duda es una mala idea y no deberías hacer este cambio y luego simplemente irte, pero cuando tu sitio no carga y ni siquiera puedes exportarlo o recuperarlo porque la interfaz de administración no está disponible, esto es de gran ayuda.
