¿Qué significa "Trying to get property of non object in.."?

15 oct 2019, 14:36:32
Vistas: 26.9K
Votos: 1

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?

10
Comentarios

¿Puedes compartirnos el código referenciado por esas advertencias?

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

Este es exactamente el 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

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

Parece que más arriba en el stack trace algo está llamando a wp_nav_menu, sin embargo, la línea 825 de nav-menu.php no hace referencia a post_title, es una verificación de valores en la papelera. ¿Has modificado archivos del núcleo de WP en `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

No modifiqué nada. Solo agregué código en mi tema, tengo una sección para agregar código Javascript. Y descargué el plugin Woody - Insert Header, footer. Para agregar el código allí también. Pero en WP-CORE o WP-includes. Nada.

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

¿Crees que debería contactar con mi host y hacer un roll-back desde ayer?

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

¿Puedes verificar instalando WP sobre tu instalación existente para que los archivos en wp-admin y wp-includes coincidan con la versión oficial? También, ¿puedes confirmar que estás actualizado y no estás usando una versión antigua de WP? Además, ¿qué cambiaste exactamente que desencadenó que esto comenzara a suceder?

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

¡YAAA! Encontré mi error jaja Hace días tenía un problema con mi sitio web y estaba caído. Activé el debug de WordPress, así que tenía esto en mi wp-config: define('WP_DEBUG', true); y
define('WP_DEBUG_LOG', true);. Acabo de eliminar esto último y coloqué define('WP_DEBUG', false); y el mensaje desapareció :D

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

¡Así que puedo pensar que todo está bien ahora...!

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

Esas advertencias siguen ocurriendo incluso si desactivas WP_DEBUG, no has solucionado el problema, solo lo has ocultado, todavía vale la pena rastrear el problema y solucionarlo

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

Voy a eliminar mi archivo de errores y ver si el error aparece de nuevo allí

Edu Sorel Edu Sorel
15 oct 2019 18:43:02
Mostrar los 5 comentarios restantes
Todas las respuestas a la pregunta 3
1

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.

15 oct 2019 15:22:30
Comentarios

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

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

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

16 oct 2019 06:36:35
0

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.

27 ago 2021 17:20:59