Ошибка WP_Widget deprecated в WordPress 4.3
Эта ошибка появилась сегодня утром после обновления моего сайта на WordPress до версии 4.3. Два других сайта на том же хостинге (все используют CPanel как административную панель) не имеют подобных проблем. На проблемном сайте company.com в админке WordPress и на самом сайте повторяется несколько раз одна и та же ошибка в верхней части страницы:
Я изучил информацию по этой проблеме, и возможно она связана с переходом с PHP4 на PHP5, хотя другие WP-сайты на том же сервере работают нормально. Я также отключил все плагины на сайте для проверки, но проблема осталась. Восстановление из резервной копии - не самый простой вариант и может вызвать свои ошибки. У кого-то еще была такая проблема сегодня/недавно?
Не помогает и то, что сообщение об ошибке предлагает решение, но оно обрывается на
Используйте...". Сообщение начинается с "company/public_html/wp-includes/...". Вторая строка гласит: "constructor method for WP_Widget is deprecated since version 4.3.0.
Версия 4.3 - это та версия WordPress, до которой было выполнено обновление сегодня. Похоже, это вызвало ошибку, но я не знаю, как её исправить.
Если для ответа нужна дополнительная информация, я с радостью её предоставлю.

Ошибка на самом деле не вызвана вашей версией PHP (конструкторы PHP 4 не будут удалены до PHP 7) — это предупреждение, генерируемое WordPress в рамках подготовки к этому. Каждое повторение ошибки означает, что плагин использует устаревший код.
Пока авторы ваших плагинов не обновят их, вы можете выполнить следующую команду в оболочке Linux, чтобы найти вызовы старых конструкторов:
grep -R "WP_Widget\(" /путь/к/вашей/установке/wp
Это даст вам список файлов, которые вы можете либо изменить через командную строку, либо с помощью редактора плагинов WordPress. Найденные строки — в основном parent::WP_Widget(args)
— следует заменить на parent::__construct(args)
.

Разве это не опровергается тем фактом, что я отключил все плагины, но ошибки остались?

WordPress уведомляет вас о том, что эта конструкция устарела, так как система готовится к PHP7. Вам следует проверить ваш пользовательский код и все плагины на использование конструкции WP_Widget. До сих пор существует множество плагинов, которым необходимо обновить свой код.
Вот список плагинов, использующих устаревшую конструкцию WP_Widget: https://gist.github.com/chriscct7/d7d077afb01011b1839d
Вы можете либо дождаться, когда авторы плагинов обновят свой код, либо временно изменить код плагинов самостоятельно. Есть хорошее руководство по изменению кода (от Криса Кристоффа):
Вместо использования следующих конструкций:
{classname}::{classname}()
, напримерWP_Widget::WP_Widget()
илиparent::{classname}()
, напримерparent::WP_Widget()
или{object}->{classname}()
, например{object}->WP_Widget()
(более конкретный пример:$this->WP_Widget()
)Используйте:
parent::__construct()
для вызова конструктора родительского класса из дочернего класса$var = new {class name}()
, например$var = new My_Widget_Class()
для создания экземпляра виджета (не используйтеMy_Widget_Class
в качестве имени класса вашего виджета, выберите что-то более уникальное и подходящее, чтобы избежать конфликтов имен классов с другими плагинами).

Похоже, что обновляется не сам WP_Widget
, а способ его вызова.
Я считаю, что нам нужно перейти от этого:
class mZ_Mindbody_day_schedule extends WP_Widget {
function mZ_Mindbody_day_schedule() {
$widget_ops = array(
'classname' => 'mZ_Mindbody_day_schedule_class',
'description' => __('Display class schedule for current day.', 'mz-mindbody-api')
);
$this->WP_Widget('mZ_Mindbody_day_schedule', __('Today\'s MindBody Schedule', 'mz-mindbody-api'),
$widget_ops );
}
К этому:
class mZ_Mindbody_day_schedule extends WP_Widget {
function mZ_Mindbody_day_schedule() {
$widget_ops = array(
'classname' => 'mZ_Mindbody_day_schedule_class',
'description' => __('Display class schedule for current day.', 'mz-mindbody-api')
);
parent::__construct('mZ_Mindbody_day_schedule', __('Today\'s MindBody Schedule', 'mz-mindbody-api'),
$widget_ops );
}
Где изменяется только шестая строка в приведённом выше коде.

Если вы хотите оставить WP_DEBUG включённым, но скрыть этот конкретный тип ошибки, добавьте в файл functions.php вашей темы следующую строку:
add_filter('deprecated_constructor_trigger_error', '__return_false');
Это предотвратит отображение подобных ошибок.
Надеюсь, это поможет :)

Я столкнулся с похожей ситуацией (сначала пришлось исправлять кастомные виджеты в теме), но сообщение об ошибке оставалось даже после исправлений.
Переключился на стандартную тему: ошибка сохранилась.
Кратко: Стал отключать плагины по одному... оказалось, что https://wordpress.org/plugins/list-category-posts/ был виновником проблемы.

Режим отладки WordPress может выдавать подобные сообщения.
У меня была такая же проблема на одном из моих сайтов.
Возможно, у вас есть эта строка в файле wp-config.php:
define('WP_DEBUG', true);
Попробуйте изменить её на:
define('WP_DEBUG', false);
Надеюсь, это поможет.
