PHP Deprecated: Il metodo non statico non dovrebbe essere chiamato staticamente

19 nov 2017, 09:53:19
Visualizzazioni: 30.4K
Voti: 3

Il mio debug.log contiene il seguente messaggio che punta a /wp-includes/shortcodes.php alla riga 319, che fa parte del core di WordPress e probabilmente non è dove si trova il vero errore nel codice.

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

Ho esaminato la riga 319 ma non mi aiuta a trovare o risolvere il problema. Ho cercato nel codice e ho trovato questo con la Classe e la funzione ma non so quale metodo non statico viene chiamato staticamente.

/**
 * Aggiunge shortcode a wordpress
 */
// add_shortcode('RSSjb', 'RSSjb_funct');
add_shortcode('RSSjb', array('RSSjbClass', 'RSSjb_funct'));
/**
 * Classe e Funzione Shortcode
 */
class RSSjbClass {
    function RSSjb_funct($atts) {
        extract(shortcode_atts(array(
        // attributi per Google News
        "gsearch" => '',
        "topic" => '',
        "location" => '',
        "geo" => '',
        "feed" => '', // richiesto
        "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));

seguito da diversi "if" e poi

    // chiama la funzione per leggere e visualizzare la lista degli elementi 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 non fornito. Questo shortcode richiede l\'attributo feed o location (per Google News).<br /> Es: <code>[RSSjb feed = "http://url-del-tuo-feed-rss-o-atom-qui"]</code>.'; 
    }
    }
}

Come posso modificarlo per adattarlo a quello che c'è in /wp-includes/shortcodes.php riga 319, che è:

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

    /**
     * Filtra l'output creato da una callback dello shortcode.
     *
     * @since 4.7.0
     *
     * @param string       $output Output dello shortcode.
     * @param string       $tag    Nome dello shortcode.
     * @param array|string $attr   Array degli attributi dello shortcode o stringa vuota.
     * @param array        $m      Array di corrispondenza espressione regolare.
     */
    return apply_filters( 'do_shortcode_tag', $output, $tag, $attr, $m );
}

Ho cercato nel Manuale PHP ma non contiene nulla sugli shortcode.

0
Tutte le risposte alla domanda 2
2

Gli shortcode sono una funzionalità di WordPress, motivo per cui non sono presenti nel manuale PHP. Ciò che potresti voler consultare nel manuale PHP è la sezione sulle callback. add_shortcode() accetta un nome di shortcode e una callback. In quella sezione del manuale PHP puoi vedere i 3 tipi principali di callback:

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

// Tipo 2: Chiamata a metodo statico di una classe
call_user_func(array('MyClass', 'myCallbackMethod'));

// Tipo 3: Chiamata a metodo di un oggetto
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

La tua funzione di callback per il tuo shortcode è del 2° tipo:

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

Questo equivale a chiamare RSSjbClass::RSSjb_funct, che è il modo per chiamare un metodo statico, ma nella tua classe il metodo RSSjb_funct() non è definito come statico:

function RSSjb_funct($atts) {

Quindi la soluzione più rapida è definire quel metodo come static:

public static function RSSjb_funct($atts) {

L'altra opzione sarebbe aggiungere lo shortcode all'interno della classe utilizzando $this, oppure creare un'istanza della classe e poi usarla in add_shortcode() come nel Tipo 3 sopra.

19 nov 2017 10:36:51
Commenti

Grazie per la spiegazione utile. Aggiungere public static ha funzionato. Vorrei votare positivamente la tua risposta ma non ho ancora abbastanza reputazione per farlo. Spero che qualcun altro la voti positivamente.

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

Ah, ho appena ottenuto la reputazione necessaria e l'ho votata positivamente.

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

Se non vuoi chiamare il metodo della classe staticamente puoi fare quanto segue

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