Что означает ошибка "Trying to get property of non object in.."?
Я перемещал что-то на своем сайте, чтобы добавить класс ко всем изображениям, и теперь появилось такое сообщение:
[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
Что могло произойти? Я сделал откат, но сообщение все еще появляется. Это опасно?

Основная проблема здесь — это предположения.
Например, допустим, у нас есть такой массив:
$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 становится практически невозможной из-за огромного количества предупреждений, которые генерируются. Всё важное тонет в море уведомлений о несуществующих свойствах объектов и ключах массивов.

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

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

Если вы сталкиваетесь с этой проблемой в функции вне шаблона темы, то добавление 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
.
