¿Qué significa "Trying to get property of non object in.."?
Estaba moviendo algo en mi web para agregar una clase a todas mis imágenes, y ahora tengo este mensaje:
[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
¿Qué podría estar pasando? He hecho un rollback pero el mensaje sigue apareciendo. ¿Es peligroso?

El problema de raíz aquí son las suposiciones.
Por ejemplo, digamos que tenemos un array aquí:
$test = [
'foo' => 'bar'
];
Si ejecutamos echo $test['foo'];
deberíamos ver bar, pero ¿qué pasa si ejecutamos echo $test['bananas'];
? No existe una entrada 'bananas' en ese array, por lo que PHP detectará esto, lanzará una advertencia/aviso similar al que estás viendo, y luego rellenará el valor faltante con ''
o null
.
Esto también ocurre con objetos, por ejemplo, si tomamos un objeto post clásico e intentamos hacer esto: echo $post->odijfnvlkdsfnvlkjdsnvkljdfnv;
, obtendremos una advertencia/aviso.
Lo mismo ocurre con tu código. Lo más probable es que el código llame a una API pero nunca verifique si fue exitoso, y simplemente asume que lo fue. O que una variable esté mal escrita.
Puedes verificar estas cosas con protecciones como if ( !empty( ... ) ) {
, o verificando los valores de retorno de las funciones de WP para ver si devolvieron lo que esperabas o si algo salió mal.
¿Qué podría pasar? He hecho un rollback pero el mensaje sigue apareciendo. ¿Es peligroso?
Sí y no, hay posibles consecuencias de esto, y depende mucho de lo que estés haciendo y cómo podría interactuar. Debido a que estás asumiendo que los valores son correctos cuando no lo son, o usando cosas que no existen, PHP sustituirá un valor de reemplazo. Ese valor es un valor false
, y podría alterar tu lógica o llevar a situaciones inesperadas. Eso podría resultar en errores crípticos o posibles vulnerabilidades de seguridad.
El mayor problema es cuando PHP está configurado para mostrar estas advertencias en el frontend, lo que puede romper REST, XMLRPC y AJAX, así como cualquier cosa que cambie los encabezados HTTP para hacer cosas.
El problema más molesto, sin embargo, es que depurar con un registro de errores de PHP se vuelve casi imposible debido a la gran cantidad de advertencias que esto generaría. Cualquier cosa de interés queda enterrada bajo un aluvión de avisos sobre propiedades de objetos y claves de arrays a las que se accede y que no existen.

Gracias por la explicación grande y clara. Y no, el mensaje no aparece en mi interfaz. Eso es bueno para mí... Aunque no sé si debería dejar las cosas así. O podría contactar con mi host para hacer un roll-back. ¿Qué dices? He desinstalado el plugin que instalé y eliminado los códigos que ingresé. Pero el mensaje sigue apareciendo

Las propiedades enumeradas en tus avisos son todas propiedades del objeto $post
. Los avisos indican que, donde se está utilizando, el objeto $post
no está definido (es decir, no es un objeto existente).
Esto puede ocurrir como resultado de plugins/temas y/o una combinación de esos elementos, o código personalizado. Según tu descripción ("Estaba moviendo algo en mi web para añadir una clase a todas mis imágenes"), lo que estás haciendo puede estar intentando utilizar el objeto $post
, pero en realidad no está definido donde intentas usarlo.
Puede ser tan simple como aplicarlo como una variable "global" en tu código (asumiendo que es un fragmento de código). Si es así, prueba añadiendo esto:
global $post;
O bien, proporciona más detalles sobre lo que cambiaste (y qué tenías antes del cambio).

Si ves que esto sucede en una función fuera de una plantilla de tema, entonces agregar global $post;
al inicio de la función podría funcionar.
Si está sucediendo en una plantilla de tema individual, primero asegúrate de que estás utilizando el objeto $post
después de la llamada a la función the_post()
.
También es probable que estés intentando usar el objeto $post
en una página que no tiene uno. Esto podría incluir resultados de búsqueda, páginas 404, archivos y cualquier otro escenario donde no se genere un objeto $post individual. En estos casos, evito el problema verificando si el objeto $post
es una instancia válida de la clase WP_Post
:
is_a($post, 'WP_Post')
Aquí hay un ejemplo funcional de donde normalmente usaría este enfoque:
/**
* Texto introductorio del Hero
*/
function hero_leadin() {
global $post;
// No existe un objeto $post
if ( ! is_a($post, 'WP_Post') ) return;
return get_field('hero__lead-in');
}
Si el archivo header.php
de mi tema utiliza esta función hero_leadin()
, no generará el aviso de PHP trying to get property 'id' of non-object
.
