PHP Deprecated: Нестатический метод не должен вызываться статически
В моем файле debug.log есть следующее сообщение, которое указывает на /wp-includes/shortcodes.php строка 319, что является частью ядра WordPress и, вероятно, не является местом, где находится реальная ошибка в коде.
PHP Deprecated: Non-static method RSSjbClass::RSSjb_funct() should not be called statically in /.../wp-includes/shortcodes.php on line 319
Я просмотрел строку 319, но это не помогло мне найти или решить проблему. Я поискал в коде и нашел это с классом и функцией, но я не знаю, что именно вызывается статически, будучи нестатическим.
/**
* Добавление шорткода в wordpress
*/
// add_shortcode('RSSjb', 'RSSjb_funct');
add_shortcode('RSSjb', array('RSSjbClass', 'RSSjb_funct'));
/**
* Класс и Функция шорткода
*/
class RSSjbClass {
function RSSjb_funct($atts) {
extract(shortcode_atts(array(
// атрибуты для Google News
"gsearch" => '',
"topic" => '',
"location" => '',
"geo" => '',
"feed" => '', // обязательно
"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));
за которым следует несколько "if" и затем
// вызов функции для чтения и отображения списка элементов ленты
return $tle . rssjb_List($feed, $filter, $num, $ltime, $list, $target, $pubdate, $pubtime, $dformat, $tformat, $pubauthor, $excerpt, $charex, $chartle, $sort, $cachefeed);
} else {
return '<br>URL RSS или Atom ленты не указан. Этот шорткод требует атрибут feed или location (для Google News).<br /> Пример: <code>[RSSjb feed = "http://ваш-url-rss-или-atom-ленты"]</code>.';
}
}
}
Как мне изменить это, чтобы соответствовать тому, что находится в /wp-includes/shortcodes.php строка 319, которая:
$output = $m[1] . call_user_func( $shortcode_tags[ $tag ], $attr, $content, $tag ) . $m[6];
/**
* Фильтрует вывод, созданный callback-функцией шорткода.
*
* @since 4.7.0
*
* @param string $output Вывод шорткода.
* @param string $tag Имя шорткода.
* @param array|string $attr Массив атрибутов шорткода или пустая строка.
* @param array $m Массив совпадений регулярного выражения.
*/
return apply_filters( 'do_shortcode_tag', $output, $tag, $attr, $m );
}
Я искал в руководстве PHP, но там нет ничего о шорткодах.
Шорткоды — это особенность WordPress, поэтому их нет в руководстве по PHP. Вместо этого в руководстве по PHP вам стоит обратить внимание на раздел о колбэках (callback). Функция add_shortcode()
принимает имя шорткода и колбэк. В этом разделе руководства PHP вы увидите три основных типа колбэков:
// Тип 1: Простой колбэк
call_user_func('my_callback_function');
// Тип 2: Вызов статического метода класса
call_user_func(array('MyClass', 'myCallbackMethod'));
// Тип 3: Вызов метода объекта
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
Колбэк-функция для вашего шорткода относится ко второму типу:
add_shortcode('RSSjb', array('RSSjbClass', 'RSSjb_funct'));
Это эквивалентно вызову RSSjbClass::RSSjb_funct
, то есть статического метода, но в вашем классе метод RSSjb_funct()
не объявлен как статический:
function RSSjb_funct($atts) {
Самое быстрое решение — объявить этот метод как static
:
public static function RSSjb_funct($atts) {
Другой вариант — добавить шорткод внутри класса, используя $this
, либо создать экземпляр класса и передать его в add_shortcode()
, как в третьем типе выше.

Спасибо за полезное объяснение. Добавление public static сработало. Я бы проголосовал за ваш ответ, но у меня пока недостаточно репутации для этого. Надеюсь, кто-то другой проголосует за него.
