Ce înseamnă "Trying to get property of non object in.."?

15 oct. 2019, 14:36:32
Vizualizări: 26.9K
Voturi: 1

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?

10
Comentarii

Puteți să ne împărtășiți codul la care se referă acele avertismente?

Tom J Nowell Tom J Nowell
15 oct. 2019 15:16:06

Acesta este mesajul exact: [15-Oct-2019 10:44:01 UTC] PHP Notice: Încercare de a accesa proprietatea 'post_title' a unui non-obiect în /home/public_html/wp-includes/nav-menu.php pe linia 825 [15-Oct-2019 10:44:01 UTC] PHP Notice: Încercare de a accesa proprietatea 'ID' a unui non-obiect în /home/public_html/wp-includes/nav-menu.php pe linia 825 [15-Oct-2019 10:44:01 UTC] PHP Notice: Încercare de a accesa proprietatea 'ID' a unui non-obiect în /home/public_html/wp-includes/nav-menu.php pe linia 829

Edu Sorel Edu Sorel
15 oct. 2019 16:20:27

Se pare că mai sus în stiva de apeluri ceva apelează wp_nav_menu, totuși, linia 825 din nav-menu.php nu face referire la post_title, ci este o verificare pentru valori șterse. Ați modificat fișierele din nucleul WP în `wp-includes? https://github.com/WordPress/WordPress/blob/master/wp-includes/nav-menu.php#L825

Tom J Nowell Tom J Nowell
15 oct. 2019 16:37:07

Nu modific nimic. Doar adaug cod în tema mea, am o secțiune pentru a adăuga cod Javascript. Și am descărcat pluginul Woody - Insert Header, footer. Pentru a adăuga codul și acolo. Dar în WP-CORE sau WP-includes. Nimic.

Edu Sorel Edu Sorel
15 oct. 2019 17:00:46

Crezi că ar trebui să iau legătura cu gazda mea și să fac roll-back de la ieri?

Edu Sorel Edu Sorel
15 oct. 2019 17:01:03

Poți verifica asta instalând WP peste instalarea existentă, astfel încât fișierele din wp-admin și wp-includes să se potrivească cu versiunea oficială? De asemenea, poți confirma că ești la zi și nu folosești o versiune veche de WP? Și exact ce ai schimbat care a declanșat această problemă?

Tom J Nowell Tom J Nowell
15 oct. 2019 18:17:49

YAAA! Am găsit greșeala mea haha Acum câteva zile am avut o problemă cu site-ul meu și a fost down. Și am activat debug-ul în WordPress, așa că am avut asta în wp-config: define('WP_DEBUG', true); și
define('WP_DEBUG_LOG', true);. Tocmai am eliminat aceasta din urmă și am pus define('WP_DEBUG', false); iar mesajul a dispărut :D

Edu Sorel Edu Sorel
15 oct. 2019 18:24:45

Așa că pot crede că totul este în regulă acum...!

Edu Sorel Edu Sorel
15 oct. 2019 18:25:27

Acele avertismente încă apar chiar dacă dezactivezi WP_DEBUG, nu ai rezolvat problema, doar ai ascuns-o acum, merită totuși să urmărești problema și să o repari

Tom J Nowell Tom J Nowell
15 oct. 2019 18:29:57

Voi șterge fișierul meu de erori și voi urmări dacă eroarea apare din nou acolo

Edu Sorel Edu Sorel
15 oct. 2019 18:43:02
Arată celelalte 5 comentarii
Toate răspunsurile la întrebare 3
1

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ă.

15 oct. 2019 15:22:30
Comentarii

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.

Edu Sorel Edu Sorel
15 oct. 2019 16:17:10
0

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).

16 oct. 2019 06:36:35
0

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.

27 aug. 2021 17:20:59