PHP Deprecat: Metodă non-statică nu ar trebui apelată static
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.
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.

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.
