PHP Deprecated: El método no estático no debe llamarse estáticamente

19 nov 2017, 09:53:19
Vistas: 30.4K
Votos: 3

Mi debug.log tiene el siguiente mensaje que apunta a /wp-includes/shortcodes.php en la línea 319, que es parte del núcleo de WordPress y probablemente no es donde está el error real en el código.

PHP Deprecated:  Non-static method RSSjbClass::RSSjb_funct() should not be called statically in /.../wp-includes/shortcodes.php on line 319

He revisado la línea 319 y no me ayuda a encontrar o resolver el problema. Busqué en el código y encontré esto con la Clase y función pero no sé qué método no estático se está llamando estáticamente.

/**
 * Añadir shortcode a wordpress
 */
// add_shortcode('RSSjb', 'RSSjb_funct');
add_shortcode('RSSjb', array('RSSjbClass', 'RSSjb_funct'));
/**
 * Clase y Función del Shortcode
 */
class RSSjbClass {
    function RSSjb_funct($atts) {
        extract(shortcode_atts(array(
        // atributos para Google News
        "gsearch" => '',
        "topic" => '',
        "location" => '',
        "geo" => '',
        "feed" => '', // requerido
        "filter" => '',
        "num" => '5',
        "ltime" => '',
        "list" => 'ul',
        "target" => '_blank',
        "pubdate" => 'false',
        "pubtime" => 'false',
        "dformat" => get_option('date_format'),
        "tformat" => get_option('time_format'),
        "pubauthor" => 'true',
        "excerpt" => 'false',
        "charex" => '',
        "chartle" => '',
        "title" => '',
        "link" => 'false',
        "sort" => 'false',
        "cachefeed" => '3600'
    ), $atts));

seguido de varios "ifs" y luego

    // llamar a la función para leer y mostrar la lista de elementos del feed
        return $tle . rssjb_List($feed, $filter, $num, $ltime, $list, $target, $pubdate, $pubtime, $dformat, $tformat, $pubauthor, $excerpt, $charex, $chartle, $sort, $cachefeed);
    } else {
        return '<br>URL del Feed RSS o Atom no proporcionada. Este shortcode requiere el atributo feed o location (si es Google News).<br /> Ej: <code>[RSSjb feed = "http://your-rss-or-atom-feed-URL-here"]</code>.'; 
    }
    }
}

¿Cómo modifico eso para que coincida con lo que está en /wp-includes/shortcodes.php línea 319, que es:

    $output = $m[1] . call_user_func( $shortcode_tags[ $tag ], $attr, $content, $tag ) . $m[6];

    /**
     * Filtra la salida creada por un callback de shortcode.
     *
     * @since 4.7.0
     *
     * @param string       $output Salida del shortcode.
     * @param string       $tag    Nombre del shortcode.
     * @param array|string $attr   Array de atributos del shortcode o cadena vacía.
     * @param array        $m      Array de coincidencias de expresión regular.
     */
    return apply_filters( 'do_shortcode_tag', $output, $tag, $attr, $m );
}

Busqué en el Manual de PHP y no tiene nada sobre shortcodes.

0
Todas las respuestas a la pregunta 2
2

Los shortcodes son algo específico de WordPress, por eso no aparecen en el manual de PHP. Lo que sí querrás revisar en el manual de PHP es la sección sobre callbacks. add_shortcode() acepta un nombre de shortcode y un callback. En esa sección del manual de PHP puedes ver los 3 tipos principales de callbacks:

// Tipo 1: Callback simple
call_user_func('my_callback_function');

// Tipo 2: Llamada a método estático de clase
call_user_func(array('MyClass', 'myCallbackMethod'));

// Tipo 3: Llamada a método de objeto
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

Tu función callback para tu shortcode es del tipo 2:

add_shortcode('RSSjb', array('RSSjbClass', 'RSSjb_funct'));

Esto es lo mismo que llamar a RSSjbClass::RSSjb_funct, que es como se llama a un método estático, pero en tu clase el método RSSjb_funct() no está definido como estático:

function RSSjb_funct($atts) {

Así que la solución más rápida es definir ese método como static:

public static function RSSjb_funct($atts) {

La otra opción sería añadir el shortcode dentro de la clase usando $this, o crear una instancia de la clase y luego usarla en add_shortcode() como en el Tipo 3 mencionado arriba.

19 nov 2017 10:36:51
Comentarios

Gracias por esa explicación tan útil. Añadir public static funcionó. Votaría tu respuesta positivamente pero aún no tengo suficiente reputación para poder hacerlo. Espero que alguien más la vote.

Cynthia A Lockley Cynthia A Lockley
19 nov 2017 11:01:17

Ah, acabo de obtener la reputación necesaria y ya la he votado.

Cynthia A Lockley Cynthia A Lockley
19 nov 2017 11:03:44
0

Si no deseas llamar al método de clase estáticamente, puedes hacer lo siguiente

add_shortcode('RSSjb', [new RSSjbClass, 'RSSjb_funct']);
20 oct 2019 02:16:42