Ce înseamnă "Trying to get property of non object in.."?
Am mutat ceva în site-ul meu pentru a adăuga o clasă tuturor imaginilor și acum primesc acest mesaj:
[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
Ce s-ar fi putut întâmpla? Am făcut rollback dar mesajul încă apare. Este periculos?

Problema de bază aici este presupunerile.
De exemplu, să zicem că avem un array aici:
$test = [
'foo' => 'bar'
];
Dacă rulăm echo $test['foo'];
, ar trebui să vedem bar, dar dacă am rula echo $test['bananas'];
? Nu există nicio intrare "bananas" în acel array, așa că PHP va observa acest lucru, va arunca un avertisment/notificare similar cu cel pe care îl vedeți, apoi va completa valoarea lipsă cu ''
sau null
.
Același lucru se întâmplă și cu obiectele, de exemplu dacă luăm un obiect post clasic și încercăm să facem asta: echo $post->odijfnvlkdsfnvlkjdsnvkljdfnv;
, vom primi un avertisment/notificare.
Același lucru este valabil și pentru codul tău. Cel mai probabil, codul apelează un API dar nu verifică niciodată dacă a fost reușit, și pur și simplu presupune că a fost. Sau, o variabilă este scrisă greșit.
Poți verifica aceste lucruri cu protecții precum if ( !empty( ... ) ) {
, sau verificând valorile returnate ale funcțiilor WP pentru a vedea dacă au returnat ceea ce te așteptai, sau dacă ceva a mers prost.
Ce s-ar putea întâmpla? Am făcut rollback dar mesajul încă apare. E periculos?
Da și nu, există posibile consecințe ale acestui lucru, și depinde foarte mult de ceea ce faci și cum ar putea interacționa. Deoarece presupui că valorile sunt bune când nu sunt, sau folosești lucruri care nu există, PHP va înlocui o valoare substitut. Acea valoare este o valoare de tip false
, și ar putea strica logica ta, sau duce la situații neașteptate. Asta ar putea fi erori criptice, sau căi de exploatare a securității.
Cea mai mare problemă este când PHP este configurat să arate aceste avertismente pe frontend, ceea ce poate strica REST, XMLRPC și AJAX, precum și orice altceva care modifică antetele HTTP pentru a face anumite lucruri.
Cea mai enervantă problemă, totuși, este că depanarea cu un log de erori PHP devine aproape imposibilă din cauza numărului mare de avertismente pe care le-ar genera. Orice lucru de interes devine îngropat sub un potop de notificări despre proprietăți de obiecte și chei de array accesate care nu există.

Mulțumesc pentru explicația detaliată și clară. Și nu, mesajul nu apare în interfața mea. Asta e bine pentru mine... Deși nu știu dacă ar trebui să las lucrurile așa. Sau aș putea să contactez gazda mea pentru a face un roll-back. Ce părere ai? Am dezinstalat plugin-ul pe care l-am instalat și am șters codurile pe care le-am introdus. Dar mesajul încă apare.

Proprietățile enumerate în notificările tale sunt toate proprietăți ale obiectului $post
. Notificările indică faptul că acolo unde acesta este folosit, obiectul $post
nu este definit (adică nu este un obiect existent).
Această situație poate apărea ca urmare a plugin-urilor/temelor și/sau a unei combinații dintre acestea, sau a unui cod personalizat. Pe baza descrierii tale ("Am încercat să mut ceva pe site-ul meu pentru a adăuga o clasă tuturor imaginilor"), ceea ce încerci să faci poate implica utilizarea obiectului $post
, dar acesta nu este definit în locul în care încerci să-l folosești.
Această problemă poate fi rezolvată la fel de simplu ca declararea lui ca variabilă "globală" în codul tău (presupunând că este un fragment de cod). Dacă da, încearcă să adaugi următoarele:
global $post;
Sau, oferă mai multe detalii despre ce ai modificat (și ce ai avut înainte de modificare).

Dacă observați acest lucru într-o funcție din afara unui șablon de temă, atunci adăugarea global $post;
la începutul funcției ar putea rezolva problema.
Dacă problema apare într-un șablon de temă, asigurați-vă mai întâi că utilizați obiectul $post
după apelul funcției the_post()
.
De asemenea, este posibil să încercați să utilizați obiectul $post
pe o pagină care nu are un astfel de obiect. Acest lucru se poate întâmpla pe paginile de rezultate ale căutării, 404, arhive sau în orice alt scenariu în care nu este generat un singur obiect $post. În aceste cazuri, evit problema verificând dacă obiectul $post
este o instanță validă a clasei WP_Post
:
is_a($post, 'WP_Post')
Iată un exemplu funcțional în care aș folosi de obicei această abordare:
/**
* Hero Lead-in
*/
function hero_leadin() {
global $post;
// Nu există obiect $post
if ( ! is_a($post, 'WP_Post') ) return;
return get_field('hero__lead-in');
}
Dacă șablonul header.php
al temei mele folosește această funcție hero_leadin()
, nu va apărea notificarea PHP trying to get property 'id' of non-object
.
