Ошибка WP_Widget deprecated в WordPress 4.3

19 авг. 2015 г., 17:25:07
Просмотры: 14.4K
Голосов: 5

Эта ошибка появилась сегодня утром после обновления моего сайта на WordPress до версии 4.3. Два других сайта на том же хостинге (все используют CPanel как административную панель) не имеют подобных проблем. На проблемном сайте company.com в админке WordPress и на самом сайте повторяется несколько раз одна и та же ошибка в верхней части страницы:

Ошибка продолжается вниз по странице, повторяясь 9 раз.

Страница с ошибкой завершается этой строкой.

Я изучил информацию по этой проблеме, и возможно она связана с переходом с PHP4 на PHP5, хотя другие WP-сайты на том же сервере работают нормально. Я также отключил все плагины на сайте для проверки, но проблема осталась. Восстановление из резервной копии - не самый простой вариант и может вызвать свои ошибки. У кого-то еще была такая проблема сегодня/недавно?

Не помогает и то, что сообщение об ошибке предлагает решение, но оно обрывается на

Используйте...". Сообщение начинается с "company/public_html/wp-includes/...". Вторая строка гласит: "constructor method for WP_Widget is deprecated since version 4.3.0.

Версия 4.3 - это та версия WordPress, до которой было выполнено обновление сегодня. Похоже, это вызвало ошибку, но я не знаю, как её исправить.

Если для ответа нужна дополнительная информация, я с радостью её предоставлю.

3
Комментарии

Вы видели это? https://make.wordpress.org/core/2015/07/02/deprecating-php4-style-constructors-in-wordpress-4-3/

kraftner kraftner
19 авг. 2015 г. 18:14:05

Ситуацию не улучшает то, что сообщение об ошибке, похоже, само предлагает решение перед тем, как обрывается в конце — Если вы посмотрите Исходный код страницы, сможете ли прочитать полное сообщение об ошибке?

Pat J Pat J
19 авг. 2015 г. 18:20:13

Как оказалось, ошибка на самом деле не обрывается, обновил пост с более точным изображением ошибки. Я видел эту статью. Есть ли способ в CPanel/WP/Хостинге узнать, какая версия PHP используется, потому что в CPanel в разделе 'PHP Configuration' это не отображается.

MuccyCork MuccyCork
20 авг. 2015 г. 12:43:06
Все ответы на вопрос 6
2

Ошибка на самом деле не вызвана вашей версией PHP (конструкторы PHP 4 не будут удалены до PHP 7) — это предупреждение, генерируемое WordPress в рамках подготовки к этому. Каждое повторение ошибки означает, что плагин использует устаревший код.

Пока авторы ваших плагинов не обновят их, вы можете выполнить следующую команду в оболочке Linux, чтобы найти вызовы старых конструкторов:

grep -R "WP_Widget\(" /путь/к/вашей/установке/wp

Это даст вам список файлов, которые вы можете либо изменить через командную строку, либо с помощью редактора плагинов WordPress. Найденные строки — в основном parent::WP_Widget(args) — следует заменить на parent::__construct(args).

20 авг. 2015 г. 04:10:18
Комментарии

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

MuccyCork MuccyCork
20 авг. 2015 г. 12:34:23

@MuccyCork устаревший код может быть частью вашей темы - команда grep найдет его в любом месте. Учтите, что она будет находить совпадения в плагинах и темах, которые не активны - в этом случае вы можете просто игнорировать эти файлы.

tjbp tjbp
20 авг. 2015 г. 13:00:19
0

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 в качестве имени класса вашего виджета, выберите что-то более уникальное и подходящее, чтобы избежать конфликтов имен классов с другими плагинами).
31 авг. 2015 г. 17:49:01
0

Похоже, что обновляется не сам 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 );
        } 

Где изменяется только шестая строка в приведённом выше коде.

25 сент. 2015 г. 00:12:23
2

Если вы хотите оставить WP_DEBUG включённым, но скрыть этот конкретный тип ошибки, добавьте в файл functions.php вашей темы следующую строку:

add_filter('deprecated_constructor_trigger_error', '__return_false');

Это предотвратит отображение подобных ошибок.

Надеюсь, это поможет :)

28 авг. 2015 г. 00:16:50
Комментарии

Это всё ещё позволяет избежать исправления проблемы?

MuccyCork MuccyCork
31 авг. 2015 г. 19:41:41

Я предпочитаю, чтобы разработчики плагинов исправили настоящую проблему: это не ошибка, а лишь уведомление, напоминающее ИМ исправить это :)

Lorenzo Zottar Lorenzo Zottar
1 сент. 2015 г. 03:23:50
1

Я столкнулся с похожей ситуацией (сначала пришлось исправлять кастомные виджеты в теме), но сообщение об ошибке оставалось даже после исправлений.

Переключился на стандартную тему: ошибка сохранилась.

Кратко: Стал отключать плагины по одному... оказалось, что https://wordpress.org/plugins/list-category-posts/ был виновником проблемы.

19 авг. 2015 г. 22:24:19
Комментарии

Хороший метод, но я отключил все плагины и всё равно получаю ту же ошибку. Если бы была возможность так же легко отключать и включать виджеты, как это можно делать с плагинами, это значительно упростило бы поиск проблем.

MuccyCork MuccyCork
20 авг. 2015 г. 12:31:58
1
-1

Режим отладки WordPress может выдавать подобные сообщения.

У меня была такая же проблема на одном из моих сайтов.

Возможно, у вас есть эта строка в файле wp-config.php:

define('WP_DEBUG', true);

Попробуйте изменить её на:

define('WP_DEBUG', false);

Надеюсь, это поможет.

27 авг. 2015 г. 14:47:26
Комментарии

Это только скроет ошибку. Отладка существует не просто так. Вы должны всегда исправлять ошибку, а не просто скрывать её. Ошибка остаётся ошибкой, скрытой или нет

Pieter Goosen Pieter Goosen
27 авг. 2015 г. 15:03:42