Как исправить: "Notice: Undefined offset: 0"?

29 янв. 2017 г., 17:58:12
Просмотры: 38.1K
Голосов: 1

Я создаю сайт на WordPress и столкнулся с проблемой в некоторых записях.

Эта проблема затрагивает только 2 из 4 статей, и после исследования я не могу найти причину этого.

Это сообщение об ошибке появляется прямо под секцией комментариев:

Notice: Undefined offset: 0 in /home/***/public_html/wp-includes/class-wp-query.php on line 3152

Когда я ищу эту строку, я нахожу следующую функцию:

скриншот кода функции rewind_posts

Я искал эту функцию в коде WordPress и нашел только несколько совпадений:

grep -r rewind_posts *
wp-content/themes/magazine/themify/themify-wp-filters.php:              rewind_posts();
wp-includes/class-wp-query.php:                 $this->rewind_posts();
wp-includes/class-wp-query.php: public function rewind_posts() {
wp-includes/feed-rdf.php:<?php rewind_posts(); while (have_posts()): the_post(); ?>
wp-includes/query.php:function rewind_posts() {
wp-includes/query.php:  $wp_query->rewind_posts();

Судя по этим результатам, существует две разных реализации функции rewind_post в query.php и class-wp-query.php.

Есть только два места, где вызывается эта функция. Я сосредоточился на том, что связано с используемой темой, themify-wp-filters.php, Она вызывается из функции: function themify_404_template. Это не говорит о многом, потому что я не просматриваю страницу 404.

В настоящее время я использую плагин Super Socializer, но я не включал функцию социальных комментариев.

Есть какие-нибудь идеи?

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

Вы отключили все ваши плагины?

funkysoul funkysoul
29 янв. 2017 г. 18:07:41

Для понимания проблемы требуется трассировка стека. Основная причина проблемы не всегда находится там, где выводится уведомление.

Mark Kaplun Mark Kaplun
29 янв. 2017 г. 19:21:19

Да, @funkysoul, я отключил все плагины, но сообщение всё ещё появляется. Затем я заменил свою тему Themify на Twenty Seventeen и, вуаля, сообщение NOTICE исчезло. Так что проблема определённо в теме.

WarioNeila WarioNeila
29 янв. 2017 г. 23:53:29
Все ответы на вопрос 5
4

Вы ищете причину PHP-уведомления в файлах ядра WordPress, но это пустая трата времени, потому что: 1) сомнительно, что вы обнаружили новую ошибку в WordPress, 2) не стоит изменять файлы ядра WordPress для исправления проблем темы или плагина, и 3) ошибка вызвана темой или плагином, а не ядром WordPress, хотя в уведомлении указаны файлы ядра.

Кроме того, это всего лишь PHP-уведомление, а не ошибка или фатальная ошибка. Оно просто говорит: "Эй, посмотри на меня, возможно, тебе стоит меня исправить, но я не ошибка." Прочитайте https://stackoverflow.com/questions/4624474/php-difference-between-notice-and-warning

УВЕДОМЛЕНИЕ (NOTICE): Это сообщение говорит о том, что вам следует или не следует делать.

ПРЕДУПРЕЖДЕНИЕ (WARNING): Возникает во время выполнения, но не прерывает работу кода.

ОШИБКА (ERROR): Также возникает во время выполнения, но выполнение программы прекращается.

Поэтому проверьте файл wp-config.php и отключите режим отладки, чтобы не видеть уведомлений: https://codex.wordpress.org/Debugging_in_WordPress. Или проверьте php.ini в вашем хостинг-аккаунте: https://stackoverflow.com/questions/1053424/how-do-i-get-php-errors-to-display

Для более эффективного поиска причины PHP-ошибки или уведомления используйте Debug, как указано выше. Но самый простой способ — деактивировать все плагины и поочередно активировать их, пока не найдете тот, который вызывает уведомление. Затем обратитесь за помощью к разработчику плагина или поищите в их форумах. Если проблема не в плагине, переключитесь на стандартную тему WordPress и проверьте, записано ли уведомление в логах ошибок с помощью wp_debug.

29 янв. 2017 г. 18:24:41
Комментарии

Если есть уведомление PHP, значит в коде есть ошибка, которая вызывает это уведомление. Очевидно, объект wp_query создан некорректно или был изменен каким-то непредвиденным образом. Но если ядро WordPress не может гарантировать целостность объекта, оно должно проверять существование индекса в массиве перед доступом к нему и/или выдавать более понятную ошибку. Автор вопроса просто выполнил отладку в пределах своего понимания, что оказалось недостаточно, но это не оправдывает утверждение, что уведомления не являются ошибками...

Mark Kaplun Mark Kaplun
29 янв. 2017 г. 19:15:30

Отличная работа, @markratledge! Я бы также добавил эту ссылку: http://stackoverflow.com/questions/6549561/notice-undefined-offset-0-in

prosti prosti
29 янв. 2017 г. 19:55:08

Спасибо за ответ, @markratledge, я очень ценю это.

Я не осознавал, что столкнулся с ошибкой PHP, а не WordPress. Наверное, это ошибка новичка.

Ваше предложение отключить режим DEBUG в wp-config.php напомнило мне, что я включил этот режим несколько дней назад. Возможно, уведомление было всегда, но я не видел его раньше, потому что DEBUG был отключен.

Я искренне благодарен вам, потому что вы помогли мне лучше понять, как работает WordPress. Спасибо.

P.S. Я попытаюсь найти корневую причину этой проблемы, но рад, что могу ее скрыть.

WarioNeila WarioNeila
29 янв. 2017 г. 23:46:33

@WarioNeila86, код WordPress - это PHP-код.

prosti prosti
30 янв. 2017 г. 00:12:35
2

Недавно я провел анализ функции rewind_posts.

>grep -r rewind_posts *
wp-content/themes/magazine/themify/themify-wp-filters.php:              rewind_posts();
wp-includes/class-wp-query.php:                 $this->rewind_posts();
wp-includes/class-wp-query.php: public function rewind_posts() {
wp-includes/feed-rdf.php:<?php rewind_posts(); while (have_posts()): the_post(); ?>
wp-includes/query.php:function rewind_posts() {
wp-includes/query.php:  $wp_query->rewind_posts();

Скорее всего, проблема не в ядре WordPress, так как ведущие разработчики WordPress не допустили бы таких ошибок.

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

wp-content/themes/magazine/themify/themify-wp-filters.php:

Использование rewind_posts без проверки условий с помощью if(). Тема должна содержать такие проверки в зависимости от того, что пытаются перемотать.

У меня нет кода, поэтому я не могу сказать больше. Вы можете отправить эту проблему в поддержку темы.

29 янв. 2017 г. 19:53:12
Комментарии

Привет @prosti, как я уже писал выше, я удалил все плагины и убедился, что это проблема темы. Я свяжусь с поддержкой Themify на случай, если они смогут помочь.

WarioNeila WarioNeila
29 янв. 2017 г. 23:56:14

Да, проблема именно в этом файле wp-content/themes/magazine/themify/themify-wp-filters.php: (в теме), как я и указал. @WarioNeila86

prosti prosti
30 янв. 2017 г. 00:09:33
0

Для меня решением оказался вызов the_post() перед вызовом the_content().

2 дек. 2020 г. 19:04:10
0

Я столкнулся с тем же уведомлением, и причина была в использовании цикла WordPress while(have_posts) внутри файла single-{name}.php. Уведомление исчезло после удаления цикла.

17 дек. 2020 г. 13:43:18
0
-1

Для удаления скрипта необходимо настроить файл wp-config.php, как указано ниже.

define( 'WP_DEBUG', false );

25 мар. 2020 г. 19:01:55