PHP Deprecat: Metodă non-statică nu ar trebui apelată static

19 nov. 2017, 09:53:19
Vizualizări: 30.4K
Voturi: 3

Fișierul meu debug.log conține următorul mesaj care indică spre /wp-includes/shortcodes.php la linia 319, care face parte din WordPress core și probabil nu acolo este eroarea reală în cod.

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

Am verificat linia 319 dar nu mă ajută să găsesc sau să rezolv problema. Am căutat în cod și am găsit următorul cod cu Clasa și funcția dar nu știu ce metodă non-statică este apelată static.

/**
 * Adaugă shortcode în wordpress
 */
// add_shortcode('RSSjb', 'RSSjb_funct');
add_shortcode('RSSjb', array('RSSjbClass', 'RSSjb_funct'));
/**
 * Clasa și Funcția pentru Shortcode
 */
class RSSjbClass {
    function RSSjb_funct($atts) {
        extract(shortcode_atts(array(
        // atribute pentru Google News
        "gsearch" => '',
        "topic" => '',
        "location" => '',
        "geo" => '',
        "feed" => '', // obligatoriu
        "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));

urmat de mai multe instrucțiuni "if" și apoi

    // apelează funcția pentru a citi și afișa lista de elemente din 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-ul feed-ului RSS sau Atom nu este furnizat. Acest shortcode necesită atributul feed sau location (pentru Google News).<br /> Ex: <code>[RSSjb feed = "http://url-ul-feed-ului-rss-sau-atom-aici"]</code>.'; 
    }
    }
}

Cum modific acest cod pentru a se potrivi cu ce este în /wp-includes/shortcodes.php linia 319, care este:

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

    /**
     * Filtrează rezultatul creat de un callback de shortcode.
     *
     * @since 4.7.0
     *
     * @param string       $output Rezultatul shortcode-ului.
     * @param string       $tag    Numele shortcode-ului.
     * @param array|string $attr   Array-ul de atribute ale shortcode-ului sau string gol.
     * @param array        $m      Array-ul de potriviri al expresiei regulate.
     */
    return apply_filters( 'do_shortcode_tag', $output, $tag, $attr, $m );
}

Am căutat în Manualul PHP și nu conține nimic despre shortcode-uri.

0
Toate răspunsurile la întrebare 2
2

Shortcode-urile sunt specifice WordPress, de aceea nu le găsiți în manualul PHP. Ceea ce trebuie să consultați în manualul PHP este secțiunea despre callback-uri. add_shortcode() acceptă un nume de shortcode și un callback. În acea secțiune a manualului PHP puteți vedea cele 3 tipuri principale de callback-uri:

// Tipul 1: Callback simplu
call_user_func('my_callback_function');

// Tipul 2: Apel de metodă statică într-o clasă
call_user_func(array('MyClass', 'myCallbackMethod'));

// Tipul 3: Apel de metodă pe un obiect
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

Funcția de callback pentru shortcode-ul dvs. este de al 2-lea tip:

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

Aceasta este echivalentă cu apelul RSSjbClass::RSSjb_funct, care este modul de a apela o metodă statică, însă în clasa dvs. metoda RSSjb_funct() nu este definită ca statică:

function RSSjb_funct($atts) {

Deci cea mai rapidă soluție este să definiți acea metodă ca static:

public static function RSSjb_funct($atts) {

Cealaltă opțiune ar fi să adăugați shortcode-ul în interiorul clasei folosind $this, sau să creați o instanță a clasei și apoi să o folosiți în add_shortcode() ca în Tipul 3 de mai sus.

19 nov. 2017 10:36:51
Comentarii

Mulțumesc pentru explicația utilă. Adăugarea public static a funcționat. Aș vota răspunsul tău în sus, dar încă nu am suficiente puncte de reputație pentru a putea face asta. Sper că altcineva îl va vota în sus.

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

Ah, tocmai am obținut reputația necesară și l-am votat în sus.

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

Dacă nu doriți să apelați metoda clasei static, puteți face următoarele:

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