Cosa significa "Trying to get property of non object in.."?
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?

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.

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

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

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
.
