El constructor WP_Widget está obsoleto ¿Solución? WordPress
Desde la versión de WodPress 4.3 (que se lanzó ayer), los llamados constructores al estilo PHP 4 están marcados como depreciados en el core. Esta decisión se ha tomado para hacer compatible WordPress con PHP 7, versión de PHP a parti de la cuál el uso de constructores PHP 4 quedará obsoleto.
Así que toca moverse hacia adelante, y merecerá la pena. PHP 7 trae consigo mejoras en rendimiento sorprendentes. Según un infographic publicado en el portal de Zend Technologies, WordPress podrá procesar prácticamente el doble de solicitudes con los mismos recursos.
Cómo preparar tus temas y plugins
Los constructores estilo PHP 4 utlizan un nombre de método igual al nombre de la clase u objeto. Algo así:
class Mi_Clase() {
function Mi_Clase() {
// Este método actuará como constructor y se ejecutará
// automáticamente en cada nueva instancia de Mi_Clase
}
}
A partir de PHP 7 estos métodos ya no son reconocidos como constructores, en su lugar se debe utilizar el método __construct()
(introducido en PHP 5):
class Mi_Clase() {
function __construct() {
// ....
}
}
Especial atención al constructor WP_Widget
El uso de constructores PHP 4 se extendió mucho en los widgets de WordPress ya que la propia clase WP_Widget
los utilizaba y, valga decirlo, los ejemplos en la documentación también. La mayoría de widgets tenían esta pinta:
class CYB_Social_Follow_Widget extends WP_Widget {
function CYB_Social_Follow_Widget() {
$widget_ops = array( 'classname' => 'follow social', 'description' => __('Social follow widget'. 'cyb' ) );
$control_ops = array( 'id_base' => 'follow' );
$this->WP_Widget( 'cyb-follow', 'Cyb Social Follow Widget', $widget_ops, $control_ops );
}
// ....
}
Como ves, no sólo se utiliza un constructor estilo PHP 4 en la propia clase, sino que se llama al constructor WP_Widget de la clase padre (fíjate en $this->WP_Widget()
). Desde WordPress 4.3 aparecerá el aviso «constructor WP_Widget() obseleto» si utilizas ese constructor y tienes habilitado WP_DEBUG
. Así que no sólo basta con utilizar __construct
en nuestra clase, sino que también hay que llamar al método __construct
de la clase padre. El código actualizado sería:
class CYB_Social_Follow_Widget extends WP_Widget {
function __construct() {
$widget_ops = array( 'classname' => 'follow social', 'description' => __('Social follow widget'. 'cyb' ) );
$control_ops = array( 'id_base' => 'follow' );
parent::__construct( 'cyb-follow', 'Cyb Social Follow Widget', $widget_ops, $control_ops );
}
// ....
}
Ahora, en lugar de utilizar $this->WP_Widget()
, parent::WP_Widget()
o WP_Widget::WP_Widget()
, tenemos que utilizar parent::__construct()
. Estas mismas instrucciones valen para cualquier caso en el que estemos extendiendo una clase del core y necesitemos llamar al constructor de la clase padre.
Referencias
- Aaron Jorbin. 2 de Julio de 2015. Deprecating PHP4 style constructors in WordPress 4.3. WordPress Dev Blog.
- Turbocharging the Web with PHP 7 [infographic]. Zend Technologies.