Что означает ошибка "Trying to get property of non object in.."?

15 окт. 2019 г., 14:36:32
Просмотры: 26.9K
Голосов: 1

Я перемещал что-то на своем сайте, чтобы добавить класс ко всем изображениям, и теперь появилось такое сообщение:

[15-Oct-2019 10:44:01 UTC] PHP Notice: Trying to get property 'post_title' of non-object in /home/public_html/wp-includes/nav-menu.php on line 825

[15-Oct-2019 10:44:01 UTC] PHP Notice: Trying to get property 'ID' of non-object in /home/public_html/wp-includes/nav-menu.php on line 825

[15-Oct-2019 10:44:01 UTC] PHP Notice: Trying to get property 'ID' of non-object in /home/public_html/wp-includes/nav-menu.php on line 829

Что могло произойти? Я сделал откат, но сообщение все еще появляется. Это опасно?

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

Можете поделиться с нами кодом, на который ссылаются эти предупреждения?

Tom J Nowell Tom J Nowell
15 окт. 2019 г. 15:16:06

Вот точное сообщение: [15-Oct-2019 10:44:01 UTC] PHP Notice: Попытка получить свойство 'post_title' несуществующего объекта в /home/public_html/wp-includes/nav-menu.php на строке 825 [15-Oct-2019 10:44:01 UTC] PHP Notice: Попытка получить свойство 'ID' несуществующего объекта в /home/public_html/wp-includes/nav-menu.php на строке 825 [15-Oct-2019 10:44:01 UTC] PHP Notice: Попытка получить свойство 'ID' несуществующего объекта в /home/public_html/wp-includes/nav-menu.php на строке 829

Edu Sorel Edu Sorel
15 окт. 2019 г. 16:20:27

Похоже, что выше по стеку вызовов что-то вызывает wp_nav_menu, однако строка 825 в nav-menu.php не ссылается на post_title, это проверка на удаленные значения. Вы изменяли файлы ядра WP в `wp-includes? https://github.com/WordPress/WordPress/blob/master/wp-includes/nav-menu.php#L825

Tom J Nowell Tom J Nowell
15 окт. 2019 г. 16:37:07

Я ничего не изменял. Я просто добавил код в свою тему, у меня есть раздел для добавления Javascript кода. И я скачал плагин Woody - Insert Header, footer, чтобы добавить код и там. Но в WP-CORE или WP-includes я ничего не трогал.

Edu Sorel Edu Sorel
15 окт. 2019 г. 17:00:46

Как думаешь, стоит ли мне связаться с хостингом и сделать откат на вчерашнее состояние?

Edu Sorel Edu Sorel
15 окт. 2019 г. 17:01:03

Можешь проверить, установив WP поверх существующей установки, чтобы файлы в wp-admin и wp-includes точно соответствовали официальной версии? Также подтверди, что у тебя актуальная версия WP, а не древняя. И что именно ты изменил, из-за чего это начало происходить?

Tom J Nowell Tom J Nowell
15 окт. 2019 г. 18:17:49

УРАА! Я нашел свою ошибку, хаха Несколько дней назад у меня были проблемы с сайтом, и он не работал. Я включил отладку WordPress, поэтому в wp-config у меня было: define('WP_DEBUG', true); и
define('WP_DEBUG_LOG', true);. Я просто удалил последнюю строку и поставил define('WP_DEBUG', false);, и сообщение исчезло :D

Edu Sorel Edu Sorel
15 окт. 2019 г. 18:24:45

Так что, думаю, теперь всё в порядке...!

Edu Sorel Edu Sorel
15 окт. 2019 г. 18:25:27

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

Tom J Nowell Tom J Nowell
15 окт. 2019 г. 18:29:57

Я собираюсь удалить свой файл с ошибками и посмотреть, появится ли ошибка там снова

Edu Sorel Edu Sorel
15 окт. 2019 г. 18:43:02
Показать остальные 5 комментариев
Все ответы на вопрос 3
1

Основная проблема здесь — это предположения.

Например, допустим, у нас есть такой массив:

$test = [
    'foo' => 'bar'
];

Если мы выполним echo $test['foo'];, мы увидим bar, но что если мы выполним echo $test['bananas'];? В этом массиве нет элемента с ключом 'bananas', поэтому PHP заметит это, выдаст предупреждение/уведомление, аналогичное тому, которое вы видите, а затем подставит отсутствующее значение как '' или null.

То же самое происходит и с объектами, например, если взять стандартный объект записи и попытаться сделать так: echo $post->odijfnvlkdsfnvlkjdsnvkljdfnv;, мы получим предупреждение/уведомление.

То же самое касается и вашего кода. Скорее всего, код вызывает API, но не проверяет, был ли вызов успешным, и просто предполагает, что всё в порядке. Или переменная написана с ошибкой.

Вы можете проверять такие ситуации с помощью защитных условий, например, if ( !empty( ... ) ) {, или проверяя возвращаемые значения функций WordPress, чтобы убедиться, что они вернули ожидаемый результат, а не что-то пошло не так.

Что может произойти? Я сделал откат, но сообщение всё равно появляется. Это опасно?

Да и нет. Возможные последствия зависят от того, что именно вы делаете и как это может взаимодействовать с другими частями системы. Поскольку вы предполагаете, что значения корректны, хотя это не так, или используете несуществующие элементы, PHP подставляет вместо них значения-заглушки. Такие значения являются false-подобными и могут нарушить вашу логику или привести к неожиданным ситуациям. Это может вылиться в загадочные ошибки или даже создать уязвимости для атак.

Самая большая проблема возникает, когда PHP настроен на отображение этих предупреждений на фронтенде, что может сломать REST, XML-RPC и AJAX, а также всё, что связано с изменением HTTP-заголовков.

Но самое неприятное — это то, что отладка с помощью журнала ошибок PHP становится практически невозможной из-за огромного количества предупреждений, которые генерируются. Всё важное тонет в море уведомлений о несуществующих свойствах объектов и ключах массивов.

15 окт. 2019 г. 15:22:30
Комментарии

Спасибо за большое и понятное объяснение. И нет, сообщение не появляется в моем интерфейсе. Это хорошо для меня... Хотя я не знаю, стоит ли оставить все как есть. Или мне стоит связаться с хостингом для отката изменений. Что скажешь? Я удалил плагин, который установил, и стер коды, которые вводил. Но сообщение все равно появляется.

Edu Sorel Edu Sorel
15 окт. 2019 г. 16:17:10
0

Свойства, перечисленные в ваших уведомлениях, являются свойствами объекта $post. Уведомления указывают на то, что в месте, где используется этот объект, он не определен (т.е. не является существующим объектом).

Это может произойти из-за плагинов/тем и/или их комбинации, либо пользовательского кода. Исходя из вашего описания ("Я перемещал что-то на своем сайте, чтобы добавить класс ко всем изображениям"), возможно, вы пытаетесь использовать объект $post, но он не определен в том месте, где вы его используете.

Решение может быть таким простым, как объявление его в качестве глобальной переменной в вашем коде (если это фрагмент кода). Если это так, попробуйте добавить следующее:

global $post;

Или предоставьте больше деталей о том, что вы изменили (и что у вас было до изменений).

16 окт. 2019 г. 06:36:35
0

Если вы сталкиваетесь с этой проблемой в функции вне шаблона темы, то добавление global $post; в начало функции может помочь.

Если это происходит в отдельном шаблоне темы, сначала убедитесь, что вы используете объект $post после вызова функции the_post().

Также возможно, что вы пытаетесь использовать объект $post на странице, где его нет. Это может включать страницы поиска, 404, архивы и любые другие сценарии, где не генерируется единичный объект $post. В таких случаях я избегаю проблемы, проверяя, является ли объект $post валидным экземпляром класса WP_Post:

is_a($post, 'WP_Post')

Вот рабочий пример, где я обычно использую этот подход:

/**
 * Hero Lead-in
 */
function hero_leadin() {
  global $post;

  // Объект $post не существует
  if ( ! is_a($post, 'WP_Post') ) return;
  
  return get_field('hero__lead-in');
}

Если в моём шаблоне header.php используется эта функция hero_leadin(), это не приведёт к PHP-уведомлению trying to get property 'id' of non-object.

27 авг. 2021 г. 17:20:59