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

  1. Aaron Jorbin. 2 de Julio de 2015. Deprecating PHP4 style constructors in WordPress 4.3. WordPress Dev Blog.
  2. Turbocharging the Web with PHP 7 [infographic]. Zend Technologies.
  • Manuel

    Buenos dias estoy presentando el siguiente error en mi pagina, lo que me paso fue que dejo de presentarme el contenido de la nada y entre las cosas que fui haciendo y trabajando en conjunto el soporte de mi hosting, lo mas que pude lograr es que me cargagra el contenido (aunque me cargo un contenido viejo y la configuracion vieja de mi plantilla, lo cual me tiene muy preocupado), y al mismo tiempo me esta arrojando el error que muestro en la imagen, pero aparte de esto no me deja accesar al admin de la pagina para editar y demas, veo que pones unas recomendaciones, pero no se como encontrar el archivo class.admin.php ya que me salen una variedad de archivos llamados class, pero este en especifico no me sale. por favor necesito de su ayuda urgente.

    • Hola Manuel.

      Tu error suena a un problema con la base de datos. Si te está presentado contenido viejo y no te deja acceder al wp-admin como lo hacías hasta hace pocos días es posible que de alguna manera se haya cargado una base de datos anterior en tu WordPress, en lugar de la más reciente.

      Te diré lo siguiente por orden de conocimiento:
      1. Por si no lo sabes, WordPress trabaja con bases de datos en las que almacena todo el contenido de nuestras páginas. Dichas bases de datos son del tipo Mysql y contienen toda la información de nuestro sitio… si las perdemos, perdemos todo, por eso es importante implementar una política de copia de seguridad de dicha base de datos, que haga copia de las mismas cada cierto tiempo (diaria, semanal, mensual… dependiendo del ritmo en que agregamos cosas nuevas a nuestro sitio). Existen plugins muy buenos que hacen esto por nosotros si tenemos poca experiencia. Hacen copia periódica de nuestra base de datos, nos la envían por email, la almacenan donde les digamos, etc.

      2. En nuestra cuenta de hosting podemos tener varias bases de datos y administrarlas a través de Cpanel. Por ejemplo en una misma cuenta de hosting podemos tener varios dominios (páginas web), y normalmente cada una tendrá su propia base de datos.

      3. ¿Cómo se indica a WordPress qué base de datos debe usar? Para eso se usa el archivo llamado wp-config.php que se encuentra en el directorio raíz de nuestro sitio, llamado generalmente public_html , aunque en otras compañías de hosting puede ser otro.
      La base de datos que debe usar WordPress, el usuario y la contraseña, son indicados en este archivo, a través de los valores siguientes:

      define(‘DB_NAME’, …);
      define(‘DB_USER’, …);
      define(‘DB_PASSWORD’, …);

      En lugar de los tres puntos estarán los valores de tu base de datos actual, el usuario y la contraseña.

      Si por ejemplo tú quieres cambiar el contenido que te presenta WordPress en un dominio, lo puedes hacer simplemente cambiado estos tres valores por valores válidos de otra base de datos 🙂

      Es posible que cuando entres a ese archivo encuentres que los valores actuales correspondan a una base de datos antigua de tu sitio.

      4. ¿Y si en realidad no sabes cuál era la última base de datos actualizada de tu sitio? Eso es muy fácil de saber. Sólo tienes que entrar al Cpanel de tu hosting, con el nombre de usuario y contraseña que ellos te han asignado. (No se trata del wp-admin del WordPress, sino de la compañía de hosting directamente). Allí, verás una serie de opciones, entre ellas la de bases de datos, debes entrar allí.

      Si ves varias bases de datos y no sabes cuál era la última buena, puedes ir probando, cambiando en el archivo wp-config.php los tres valores indicados más arriba (nombre de la base de datos, usuario, password) por los valores de cada base de datos que veas. Para facilitar esto, puedes copiar las tres líneas con sus valores originales, comentarlas y cambiar la copia, algo así:

      /**
      *aquí dejas por el momento tus valores originales, por si necesitas volver a ellos
      define(‘DB_NAME’, …);
      define(‘DB_USER’, …);
      define(‘DB_PASSWORD’, …);
      */

      //vas cambiando aquí para probar las otras posibles bases de datos:

      define(‘DB_NAME’, …);
      define(‘DB_USER’, …);
      define(‘DB_PASSWORD’, …);

      Si no conoces las passwords las puedes cambiar desde el mismo Cpanel, verás en alguna parte una opción para ello. Cuando hayas cambiado los tres valores en el wp-config.php luego abres tu sitio en el explorador y ves el contenido que te muestra. Si es el que esperabas (el más actualizado) significa que esa es la base de datos buena… Si ves otra cosa, cambias a otra base de datos o vuelves a los valores iniciales. Si al probar todas las bases de datos que haya no ves el resultado que esperabas, significa que de alguna manera has perdido tu base de datos actualizada… pero aún podría haber una posible solución.

      5. Si al probar todas las posibles bases de datos ves que ninguna contiene lo que esperabas, puedes preguntar a tu compañía de hosting si tienen una copia de seguridad (backup) de tus últimas bases de datos. Hoy día una compañía de hosting decente brinda esta opción. Ellos hacen una copia periódica de nuestras bases de datos y las restauran en caso de que haya problemas. Aunque yo particularmente no me fío mucho de ellos y prefiero establecer mi propia política de backups.

      6. ¿Y qué pasa con el usuario del wp-admin? El que tu usuario de wp-admin no funciona es otro síntoma de que posiblemente tu actual WordPress tenga otra base de datos distinta a la que estás buscando, quizá en alguna manipulación se ha cambiado la base de datos de tu WordPress. La solución en todo caso es tratar de recuperar tu base de datos más actualizada siguiendo los procedimientos indicados anteriormente. De todos modos, para conocimiento, siempre es posible cambiar las credenciales de nuestro usuario de wp-admin accediendo a la base de datos de WordPress y cambiando el valor de user_pass en la tabla wp_XXXXXXX_users (las XXX… representan la combinación asignada al crear tu base de datos WordPress).

      Espero que con estas ideas puedes acercarte a una solución de tu problema. He tratado de ser lo más claro posible, sobre todo porque cuando empezamos en este mundo de WordPress nos pasan cosas como estas y muchas veces no es fácil encontrar la salida, aunque a veces no sea tan complicado… se trata de comprender los conceptos fundamentales.

      7. Otra cosa. Cuando al final todo vuelva a la normalidad, recomendaría cambiar tus dos claves: la de wp-admin y la de tu cuenta de Cpanel. Y también borraría de WordPress todos los plugins que no sean necesarios. No basta con desactivarlos, a veces ciertos plugins antiguos contienen errores de seguridad y los intrusos pueden entrar en nuestra configuración aunque los mismos estén desactivados.

      Saludos.

    • Manuel

      Muchas gracias por tu ayuda y el detalle de toda la información más calro de ahí no puede ser, de verdad que me has ayudado muchísimo.

  • RoL

    Una consulta, esto es a la hora de construir los plugines? o a la hora de definir los widgets que vamos a tener en nuestro dashboard

  • gaston

    en mi pagina de worpress,me da el siguiente error:
    Strict Standards: Redefining already defined constructor for class OT_Admin in /home3/sn000513/public_html/wp-content/themes/promotion/functions/theme_options/classes/class.admin.php on line 41
    entre a ese archivo, en la linea 41, y dice,,,, function __construct()
    no se que tengo que hacer?
    ayuda por favor!!!!!!!

    • Hola Gastón. El mensaje de error dice que estás definiendo el mismo constructor dos veces en la misma clase.

      Personalmente creo que si el código del archivo class.admin.php lo has creado tú mismo, debes proceder al ponerlo al día, siguiendo los pasos explicados más arriba. Antes de modificar el código, guarda una copia de cada archivo que vayas a modificar, por seguridad.

      Pero si este archivo corresponde a un plugin de WordPress o a una plantilla de terceros… En este caso lo mejor sería contactar con los creadores del plugin o plantilla o ver si no las han actualizado. Evidentemente, por ese mensaje y los otros que muestras en la imagen, tu código no esta optimizado para las nuevas versiones de php.

  • Hola. Gracias por la explicación, es clara y me ha servido para poner al día mi código PHP. Señalo que hay un error en el código, en la línea:

    parent::__construt( 'cyb-follow', 'Cyb Social Follow Widget', $widget_ops, $control_ops );

    está escrito construt, cuando debería ser construct

    • Muchísimas gracias por avisar. Corregido.

  • Gastón Vuidepot

    Hola, ¿Y cómo puede solucionarse este problema? (En un nivel básico – intermedio, si es posible, con algún ejemplo práctico o un paso a paso). ¡Muchas gracias!

    • Lo siento pero no termino de entender cuál es tu consulta. ¿A qué problema te refieres, al uso del constructor WP_Widget? Si es así, en el post se explica, ¿qué es lo que no has entendido?

  • Guto

    thanks, good article!