Dónde se guardan los menús de WordPress en la base de datos

Como ya sabéis no es muy recomendable ponerse a tocar la base de datos de WordPress sin ton ni son, pero a veces, puede ser interesante entender cómo funciona y, muy ocasionalmente, puedes necesitar hacer algún cambio pequeño porque se te haya quedado algo corrupto, y tu último backup no sea demasiado reciente. Hace poco me dejó de aparecer el menú al entrar en Apariencia / Menú, justo después de ponerle un nombre complejo a un menú, con formatos HTML y pensé “¡Ya me lo he cargao!”. Más o menos ésta era mi cara:

Recientemente me había pasado algo parecido por una incompatibilidad con un plugin, pero esta vez fue justo al meter el HTML en el menú, así que me dije que tenía que ser por eso. Tenía un backup de la noche anterior, pero la pereza de restaurarlo era infinita y perder lo que había hecho en el día, buff, unas 2-3 horitas mínimo, y eso si me acordaba de todo lo que había hecho. Así que me dije: “esto no puede ser tan difícil”. Entro en la base de datos, cambio el chorizo HTML que he puesto en el título por una cosa normal y santas pascuas. Seguro que hay una tabla wp_menu con un campo menu_title. Busco donde ponga algo del HTML que he puesto, lo cambio en un pis-pas y problema solucionado.

¡Ayyyy! que inocente era yo entonces (ayer) y qué bonito me parecía el mundo. Fue entonces cuando me topé con la dura realidad del modelo de datos de WordPress. Me costó un rato navegar por un montón de posts localizados con Google contando cosas de la base de datos que no eran lo que yo buscaba. Y cuando por fin vi la luz en stackoverflow, descubrí que ni tabla wp_menu, ni campo menu_title, ni leches en vinagre. Era bastante más enrevesado. Pero siguiendo paso a paso, de tabla en tabla, como si fuera un juego de pistas, conseguí comprender cómo funciona y, la verdad, me pareció muy interesante entenderlo.

Fue entonces, cuando me pareció que le debía algo al mundo de la Internés, así que aqui estoy, contandoos como funciona esto. ¡Que empiecen los Septuagésimo Cuartos Juegos de los Menús de WordPress!

  • Aviso spoiler: Al final mi problema con los menús no era tal. Efectivamente el menú desapareció del administrador tras hacer el cambio, pero con solo refrescar, tardo bastante, pero me apareció el menú. La otra vez que me ocurrió no hubo forma, por eso cuando me vi en este déjà-vu tiré inmediatamente la toalla y no probé algo tan tonto como el botón F5.
  • Aviso spoiler 2: SÍ que se puede poner código HTML en una entrada de menú, sin ningún problema. Si miráis un poco más arriba veréis el menu KIDS con pleno colorido al más puro estilo Toys R’ Us, y esa fuente Comic Sans que todos adoramos. Eso era justamente lo que estaba haciendo, y a mí me parece que no ha quedado nada mal… (¡Modestooo! baja que sube Mister Pedro) ¿Por dónde íbamos? Ah,si…

¡Que empiecen los Septuagésimo Cuartos Juegos de los Menús de WordPress!

En esta edición, vamos a perseguir a un menú con formato extraño que se nos ha escapado. ¿Quién será el primero en cazarlo?

Las presentaciones

Antes que nada, vamos a presentaros: aquí el modelo de datos de WordPress, aquí un lector o lectora de mi blog.

WP3.8 ERD 733x1024  Dónde se guardan los menús de WordPress en la base de datos

Modelo de datos de WordPress 3.8+

Fuente: http://codex.wordpress.org/Database_Description

Si conoces ya el modelo de WordPress estarás diciendo: “Si, claro, la típica imagen con el modelo de datos del WordPress, vaya novedad”. Y sino, estarás diciendo: “No entiendo nada de nada”. En cualquier caso, poner esto aquí, es completamente inútil, ¿no? Pues no, listillo, te va a venir bien para seguir el juego de pistas. Considéralo el mapa de la Arena de los Juegos del Hambre.

 

Primera pista: la tabla wp_term_taxonomy

Doy por hecho que sabes cómo acceder a tu base de datos con phpMyAdmin o algo parecido, y que tienes localizada la base datos en la que se almacena todo tu WordPress. Si no, tienes un problema mucho más gordo y tendrás que averiguarlo. Seguro que Google (o mejor aún, tu proveedor de hosting) te ayuda a encontrarlo.

Bien, pues lo primero que tienes que hacer es ir a tu tabla wp_term_taxonomy, y buscar aquellas entradas en las que el campo taxonomy, contenga “nav_menu”.

SELECT * FROM `wp_term_taxonomy` WHERE `taxonomy` LIKE ‘nav_menu’

wp term taxonomy MisterPedro.com 1  Dónde se guardan los menús de WordPress en la base de datos

La tabla wp_term_taxonomy, almacena la estructura de las clasificaciones que se almacenan en wp_terms: categorías, etiquetas… y también menús. Las entradas que sean de tipo “nav_menu” son las de los menús customizados que hayas definido en tu WordPress en el apartado Ajustes / Menús del administrador. Es posible que solo tengas uno, pero si tuvieras más de uno, el campo Count, te puede guiar para saber cuál estás buscando. En mi caso está muy claro, es el menú que tiene 10 entradas (count=10).

Nos anotamos en un papelito, el term_id del menú en cuestión. En este caso, el 26.

Segunda pista: la tabla wp_terms

wp terms  Dónde se guardan los menús de WordPress en la base de datos

Tabla wp_terms_taxonomy de WordPress y sus relaciones – MisterPedro.com

Fuente: http://codex.wordpress.org/Database_Description

A continuación vamos a buscar en la tabla wp_terms, todos aquellos términos que tengan el campo term_id igual al número que hemos anotado (26). La tabla wp_terms almacena las diferentes formas de clasificar los post: categorías, etiquetas, etc… y también los menús.

SELECT * FROM `wp_terms` WHERE `term_id` = 26

wp terms MisterPedro.com 1  Dónde se guardan los menús de WordPress en la base de datos

En nuestro caso, nos va a servir para verificar que vamos por el buen camino. Al hacer esta búsqueda vamos a poder ver el nombre, y el slug del menú. Efectivamente, el que estábamos buscando es el “Menú horizontal”, así que ¡estamos sobre la pista”

Pista 3: La tabla wp_term_relationships

wp term relationships  Dónde se guardan los menús de WordPress en la base de datos

Tabla wp_term_relationships de WordPress y sus relaciones

Fuente: http://codex.wordpress.org/Database_Description

Ahora nos toca empezar a rastrear por dónde se han dispersado esas escurridizas 10 opciones de menú. Para ello olfateamos ahora la tabla wp_term_relationships. Volvemos a mirar la primera tabla que vimos wp_term_taxonomy, y miramos ahora el term_taxonomy_id. Para el menú que buscamos, casualmente este código es también el 26, pero no os equivoquéis, si te fijas en el otro registro de esta tabla, los dos números son diferentes (term_id=46; term_taxonomy_id=48).

Bien, pues tenemos de nuevo un 26, casualidades de la vida, y ahora vamos a buscar por el campo term_taxonomy_id en la tabla wp_term_relationships. Esta tabla establece la relación entre las estructuras (o taxonomías) y los elementos que las componen.

Os voy adelantando que cada opción del menú se guarda, como casi todo lo importante de WordPress, en la tabla wp_posts. ¿Pensabas que en WordPress sólo los posts son posts? Pues no majo. En WordPress todo lo importante son posts: Los posts, las páginas… y también las opciones de menú.

SELECT * FROM `wp_term_relationships` WHERE `term_taxonomy_id` = 26

wp term relationships.com   Dónde se guardan los menús de WordPress en la base de datos

La tabla wp_term_relationship nos está dando la relacion entre wp_term_taxonomy y wp_posts. Es decir, entre el nav_menu de código 26 de la tabla wp_term_taxonomy,  que vimos en wp_terms que para los amigos se llama “Menú Horizontal”, y los 10 elementos de menú que contiene. Nos vamos acercando sigilosamente a nuestro objetivo y lo tenemos ya casi en el punto de mira.

Pista 4: La tabla wp_posts

¡Ajá! Ya nos hemos acercado a la guarida de los menús. Están todos escondidos en la tabla wp_posts, haciéndose pasar por posts. Los muy cucos. Pero nosotros ya los tenemos fichados. Tenemos los DNI, digo los ID, de los 10 sospechosos, así que ahora sólo tenemos que meter los 10 códigos que había en el campo object_id de la tabla wp_term_relationships en una query para sacarlos de su escondite. Los buscamos en el campo ID de la tabla wp_posts.

SELECT * FROM `wp_posts` WHERE `ID` IN (86,80,90,27,55,74,125,310,816,821)

wp posts 1 MisterPedro.com   Dónde se guardan los menús de WordPress en la base de datos

Vaya, vaya, vaya. ¿Qué tenemos aquí? Ponemos todos los sospechosos en fila y el elemento 816 tiene una cara de culpable que se cae de culo. No vamos a necesitar rueda de reconocimiento ni jurado popular… ¡Te cacé!

Ahora que lo hemos fichado, podemos entrar a editar el registro y cambiar el campo post_title, o algún otro campo que queramos. wp posts record MisterPedro.com   Dónde se guardan los menús de WordPress en la base de datos

Fijaos en que no todos los registros tienen relleno el campo post_title. Eso es porque en mi caso estos menús llevan casi todos a páginas, y lo normal es que el menú tenga el mismo nombre que la página. Sólo cuando lo cambias en el menú y pones algo distinto, WordPress almacena este valor. De esta forma, si cambias los nombres de las páginas, los menús también se cambian, si no se ha puesto algo específico. Y eso lo hace WordPress sin que nos demos cuenta, porque en el menú, aparentemente, si que está escrito el título, con el mismo nombre que la página. Fijaos en los campos Etiqueta de navegación y Original.

Ajustes Menu WordPress MisterPedro.com   Dónde se guardan los menús de WordPress en la base de datos

El remate: la tabla wp_postmeta

wp posts  Dónde se guardan los menús de WordPress en la base de datos

Tabla wp_postsmeta de WordPress y sus relaciones – MisterPedro.com

Quizá os estéis preguntando… “Y si el menú que busco es uno de esos que no cambia el título, y no aparece nada en el campo post_title de wp_post… ¿cómo sé que menú es?”. Excelente pregunta, querido Watson. La respuesta a tu pregunta está en la tabla wp_postmeta. En la tabla wp_post tenemos al sospechoso delante, y podemos ver lo alto que es, y si es rubio. Pero en la tabla wp_postmeta es como si le registrásemos y le encontramos su cartera. Ahí ya podemos ver su DNI, su número de carnet de conducir, la foto de la novia y si pertenece a un partido político o a un club de filatelia. Toda la información que rodea al falso post, o sea el elemento de menú, está en wp_postmeta (enhorabuena, acabas de comprender el concepto de metadato). Así que no tenemos más que mirar el campo ID de la tabla wp_posts, en nuestro caso el presunto culpable 816  y buscar por el campo post_id en la tabla wp_postmeta.

SELECT * FROM `wp_postmeta` WHERE `post_id` = 816

wp post meta MisterPedro.com   Dónde se guardan los menús de WordPress en la base de datos

Aquí podemos ver unos cuantos registros con datos asociado al 816. Con cosas tan interesantes como que es un menú que lleva a una página (_menu_time_object_id: page) y que esta página es de hecho el falso post 814, de la tabla wp_posts. Si el menú estuviera anidado, podríamos ver cuál es su padre en el registro _menu_item_menu_item_parent.

wGfPScN1  Dónde se guardan los menús de WordPress en la base de datos

Para terminar de rematar nuestra investigación, consultamos de nuevo la tabla wp_posts, para ver cuál es esa página (otro falso post) de la tabla wp_posts con ID 814.

SELECT * FROM `wp_posts` WHERE `ID` = 814

wp posts 814 MisterPedro.com   Dónde se guardan los menús de WordPress en la base de datos

Efectivamente esa es la página a la que tiene que ir el menú KIDS y ahí tenemos también toda la información que queramos, así que… ¡prueba superada!

 Un atajo: cómo ahorrarnos pasos

De lo que se trataba aquí era de entender cómo se almacenan los menús en WordPress, y si has llegado leyendo hasta aquí es que ya eres un supermegaexpertodelaleche en menús WordPress ¡enhorabuena!. Pero si lo que queremos es resolver un problema parecido al que teníamos, hay una forma que posiblemente es más rápida. Ir directamente a la tabla wp_posts y buscar los registros en los que el campo post_type sea igual a “nav_menu_item”.

SELECT * FROM `wp_posts` WHERE `post_type` = ‘nav_menu_item’

wp posts 2 MisterPedro.com   Dónde se guardan los menús de WordPress en la base de datos Como ves no hay muchos más registros que los que encontramos en nuestra query. Para ser exactos están los 10 que había en el menú que nos interesa, y los 3 que hay en el otro menú que apareció cuando buscamos en wp_term_taxonomy la primera vez. Nuestro registro “raro” se ve enseguida igualmente, y nos hemos ahorrado los pasos 1, 2 y 3. Eso sí, si el problema no se ve a la primera y tenemos que empezar a buscar los detalles para cada uno de estos sospechosos en la tabla wp_postmeta, entonces tenemos 13 en vez de 10. Si en vuestro WordPress tenéis un sólo menú, así sería más fácil. Si tenéis muchos menús, así sería más difícil.

 

Resumen

En este diagramilla podéis ver un resumen de los pasos que hemos dado de tabla en tabla.

Diagram menus WordPress MisterPedro.com 2  Dónde se guardan los menús de WordPress en la base de datos

Conclusión

Entender el modelo de datos de WordPress, puede ser muy útil. No sólo para buscar errores o cosas raras, como ha sido este caso. También si quieres desarrollar un plugin relacionado con menús, o si quieres hacer una conexión de otra aplicación con WordPress, por ejemplo, para que muestre los mismos menús.

Pues eso es todo amigos. Espero que os haya resultado útil este post, aunque largo, que hayáis aprendido tanto como yo sobre cómo almacena WordPress los menús en su base de datos Para mañana por la tarde más o menos ya se me habrá olvidado casi todo, pero ahora tengo este post para recordármelo. También que os  hayáis echado alguna risa que otra con los gif y comentarios.

¡Saludos y que la suerte esté siempre de vuestra parte!

Autor: Mister Pedro

Mister Pedro es Pedro García Navarro. Un apasionado del Geomarketing, WordPress, la tecnología y las redes sociales. Si quieres contactar con él, puedes escribirle a hola@misterpedro.com

Compartir esta publicación en

8 Comentarios

    • ¡Muchas gracias Jose!. Como me has pillado. La verdad es que me reía yo solo tela escribiendo esto ^_^

      Post a Reply
  1. Hola, he seguido sus pasos y he encontrado muchos enlaces y me estoy volviendo loco. Ante todo muchas gracias por este articulo, mi problema es que se me ha borrado muchos enlaces que tenía en mi menú de wordpress al agregar un nuevo enlace. Cómo puedo recuperar todo mi menu? es que son casi 100 enlaces que no tengo en mi menú. Como hago para recuperar todo? gracias!!!

    Post a Reply
    • Gaby. Si ir siguiendo las tablas como explico no te ha ayudado, solo te puedo recomendar que tiraras de backup, aunque supongo que ya lo habrás hecho. Un backup diario es completamente imprescindible en WordPress, nos guste o no, por cosas como esta. ¡Suerte!

      Post a Reply