Cosa significa "Trying to get property of non object in.."?

15 ott 2019, 14:36:32
Visualizzazioni: 26.9K
Voti: 1

Stavo spostando qualcosa nel mio sito web per aggiungere una classe a tutte le mie immagini, e ora ho questo messaggio:

[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

Cosa potrebbe essere successo? Ho fatto il rollback ma il messaggio appare ancora. È pericoloso?

10
Commenti

Puoi condividere con noi il codice a cui si riferiscono quei warning?

Tom J Nowell Tom J Nowell
15 ott 2019 15:16:06

Questo è esattamente il messaggio: [15-Oct-2019 10:44:01 UTC] PHP Notice: Tentativo di accedere alla proprietà 'post_title' di un non-oggetto in /home/public_html/wp-includes/nav-menu.php alla riga 825 [15-Oct-2019 10:44:01 UTC] PHP Notice: Tentativo di accedere alla proprietà 'ID' di un non-oggetto in /home/public_html/wp-includes/nav-menu.php alla riga 825 [15-Oct-2019 10:44:01 UTC] PHP Notice: Tentativo di accedere alla proprietà 'ID' di un non-oggetto in /home/public_html/wp-includes/nav-menu.php alla riga 829

Edu Sorel Edu Sorel
15 ott 2019 16:20:27

Sembra che più in alto nello stack trace qualcosa stia chiamando wp_nav_menu, tuttavia la riga 825 di nav-menu.php non fa riferimento a post_title, è un controllo per valori cestinati. Hai modificato i file del Core di WP in `wp-includes? https://github.com/WordPress/WordPress/blob/master/wp-includes/nav-menu.php#L825

Tom J Nowell Tom J Nowell
15 ott 2019 16:37:07

Non modifico nulla. Aggiungo semplicemente del codice nel mio tema, ho una sezione per aggiungere codice Javascript. E ho scaricato il plugin Woody - Insert Header, footer. Per aggiungere il codice anche lì. Ma in WP-CORE o WP-includes. Niente.

Edu Sorel Edu Sorel
15 ott 2019 17:00:46

Pensi che dovrei contattare il mio host e fare un roll-back a ieri?

Edu Sorel Edu Sorel
15 ott 2019 17:01:03

Puoi verificarlo installando WP sopra la tua installazione esistente in modo che i file in wp-admin e wp-includes corrispondano alla versione ufficiale? Puoi anche confermare di essere aggiornato e non di utilizzare una vecchia versione di WP? Inoltre, cosa hai cambiato esattamente che ha fatto sì che questo problema iniziasse a verificarsi?

Tom J Nowell Tom J Nowell
15 ott 2019 18:17:49

YAAA! Ho trovato il mio errore jaja Qualche giorno fa ho avuto un problema con il mio sito web ed era offline. E ho attivato il debug di WordPress, quindi avevo questo nel mio wp-config: define('WP_DEBUG', true); e
define('WP_DEBUG_LOG', true);. Ho semplicemente eliminato quest'ultimo e ho inserito define('WP_DEBUG', false); e il messaggio è scomparso :D

Edu Sorel Edu Sorel
15 ott 2019 18:24:45

Quindi posso pensare che ora tutto sia a posto...!

Edu Sorel Edu Sorel
15 ott 2019 18:25:27

Quegli avvisi continuano a verificarsi anche se disattivi WP_DEBUG, non hai risolto il problema, è solo nascosto ora, vale ancora la pena individuare il problema e risolverlo

Tom J Nowell Tom J Nowell
15 ott 2019 18:29:57

Eliminerò il mio file degli errori e controllerò se l'errore ricompare di nuovo lì

Edu Sorel Edu Sorel
15 ott 2019 18:43:02
Mostra i restanti 5 commenti
Tutte le risposte alla domanda 3
1

Il problema principale qui sono le assunzioni.

Ad esempio, supponiamo di avere un array qui:

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

Se eseguiamo echo $test['foo']; dovremmo vedere bar, ma cosa succede se eseguiamo echo $test['bananas'];? Non c'è alcuna voce "bananas" in quell'array, quindi PHP lo noterà, genererà un warning/notice simile a quello che stai vedendo, poi riempirà il valore mancante con '' o null.

Questo accade anche con gli oggetti, ad esempio se prendiamo un classico oggetto post e proviamo a fare questo: echo $post->odijfnvlkdsfnvlkjdsnvkljdfnv;, otterremo un warning/notice.

Lo stesso vale per il tuo codice. Molto probabilmente, il codice chiama un'API ma non verifica mai se ha avuto successo, e dà per scontato che sia così. Oppure, una variabile è scritta male.

Puoi verificare queste cose con controlli come if ( !empty( ... ) ) {, o controllando i valori di ritorno delle funzioni di WordPress per vedere se hanno restituito ciò che ti aspettavi o se qualcosa è andato storto.

Cosa potrebbe succedere? Ho fatto un rollback ma il messaggio continua ad apparire. È pericoloso?

Sì e no, ci sono possibili conseguenze di questo, e dipende molto da cosa stai facendo e come potrebbe interagire. Poiché stai assumendo che i valori siano corretti quando non lo sono, o stai usando cose che non esistono, PHP sostituirà un valore segnaposto. Quel valore è un valore false-ish e potrebbe incasinare la tua logica o portare a situazioni inaspettate. Potrebbero essere errori criptici o vie per sfruttare vulnerabilità di sicurezza.

Il problema più grande è quando PHP è configurato per mostrare questi warning nel frontend, il che può rompere REST XMLRPC e AJAX, così come qualsiasi cosa che modifichi gli header HTTP per fare operazioni.

Il problema più fastidioso, però, è che il debug con un log degli errori PHP diventa quasi impossibile a causa dell'enorme quantità di warning che verrebbero generati. Qualsiasi cosa di interesse viene seppellita sotto una valanga di notice su proprietà di oggetti e chiavi di array a cui si accede ma che non esistono.

15 ott 2019 15:22:30
Commenti

Grazie per la spiegazione ampia e chiara. E no, il messaggio non appare nella mia interfaccia. Per me va bene... Anche se non so se dovrei lasciare le cose così. O potrei contattare il mio host per fare un roll-back. Che ne dici? Ho disinstallato il plugin che avevo installato e cancellato i codici che avevo inserito. Ma il messaggio continua ad apparire

Edu Sorel Edu Sorel
15 ott 2019 16:17:10
0

Le proprietà elencate nei tuoi avvisi sono tutte proprietà dell'oggetto $post. Gli avvisi indicano che dove viene utilizzato, l'oggetto $post non è definito (cioè non è un oggetto esistente).

Questo può verificarsi a causa di plugin/temi e/o una combinazione di questi elementi, o codice personalizzato. In base alla tua descrizione ("Stavo spostando qualcosa nel mio sito web per aggiungere una classe a tutte le mie immagini"), ciò che stai facendo potrebbe aver bisogno di utilizzare l'oggetto $post, ma in realtà non è definito dove stai provando a usarlo.

Potrebbe essere semplice come dichiararlo come variabile "globale" nel tuo codice (supponendo che sia uno snippet di codice). In tal caso, prova ad aggiungere questo:

global $post;

Oppure, fornisci maggiori dettagli su cosa hai modificato (e cosa avevi prima della modifica).

16 ott 2019 06:36:35
0

Se vedi che questo accade in una funzione al di fuori di un template del tema, allora aggiungere global $post; all'inizio della funzione potrebbe funzionare.

Se invece accade in un singolo template del tema, assicurati prima di tutto di utilizzare l'oggetto $post dopo la chiamata alla funzione the_post().

È anche probabile che tu stia cercando di utilizzare l'oggetto $post in una pagina che non ne ha uno. Questo può includere i risultati di ricerca, pagine 404, archivi e qualsiasi altro scenario in cui non viene generato un singolo oggetto $post. In questi casi evito il problema controllando se l'oggetto $post è un'istanza valida della classe WP_Post:

is_a($post, 'WP_Post')

Ecco un esempio funzionante di dove tipicamente utilizzo questo approccio:

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

  // Non esiste un oggetto $post
  if ( ! is_a($post, 'WP_Post') ) return;
  
  return get_field('hero__lead-in');
}

Se il file header.php del mio tema utilizza questa funzione hero_leadin(), non genererà il notice PHP trying to get property 'id' of non-object.

27 ago 2021 17:20:59