Mover personalizaciones al tema hijo en WordPress

En este artículo vamos a describir los pasos necesarios para que todas las personalizaciones que hemos realizado sobre un tema de WordPress 6.2 podamos llevarlas al tema hijo que hemos definido a posteriori.

Contexto del problema

Llevas unos días añadiendo contenido de forma furiosa a tu nuevo sitio WordPress, le estás poniendo todos los plugins más molones, estás añadiendo personalizaciones de css y estás super engorilado porque ves que te está saliendo una web finísima. Pero un día, se te ocurren unas modificaciones que van a requerir tocar un poco de PHP y piensas «sin problema, creo un tema hijo para que las actualizaciones de este tema no machaquen mis cambios, como Dios manda». Así que creas tu tema hijo, lo activas desde tu panel de administración y cuando vas a comprobar el resultado te das cuenta tus plantillas personalizadas, tus bloques reutilizables, las modificaciones que habías realizado en las partes de tus plantillas… todo eso lo has perdido.

tema hijo en WordPress

Es en ese preciso momento cuando te maldices por no haber caído en crear el tema hijo antes de haber comenzado a diseñar tu web. Te pones a buscar soluciones por internet pero solo encuentras soluciones inconclusas.

Pues no llores, pequeño pony, porque a continuación te explico los pasos que te van a sacar de este pozo de angustia.

Atención: Si bien los pasos que describo en esta entrada solucionaron el problema en mi caso, no me hago responsable de problemas inesperados. Realiza estos cambios previamente en un entorno controlado para verificar de forma segura que también solucionan tu caso.

Traspasar configuraciones del personalizador a tema hijo en WordPress

Todas las configuraciones del personalizador de temas de WordPress se almacenan en la tabla wp_options, concretamente en registros con el nombre theme_mods_XXX donde XXX es el nombre del tema. Puedes ver estos registros con esta select:

SELECT * FROM wp_options WHERE option_name LIKE 'theme_mods_%';

Por lo tanto tu primer paso va a ser copiar la configuración de tu tema padre al tema hijo. En mi caso, el tema padre elegido fue twentytwentythree y el nombre que le di al tema hijo fue twentytwentythree-child. Así que hice el cambio con este script:

SET @parent_theme = 'twentytwentythree';
SET @child_theme = 'twentytwentythree-child';

SET @option_value = (
  SELECT option_value 
  FROM wp_options 
  WHERE option_name = CONCAT('theme_mods_', @parent_theme) COLLATE utf8mb4_unicode_520_ci
);

UPDATE wp_options
SET option_value = @option_value
WHERE option_name = CONCAT('theme_mods_', @child_theme) COLLATE utf8mb4_unicode_520_ci;

Es probable que tu base de datos no tenga la misma colación que la mía por lo que es posible que tengas que cambiar la parte del COLLATE con el tuyo propio, o incluso que no necesites ni añadirlo.

Traspasar plantillas y bloques a tema hijo en WordPress

El paso anterior fue el que conseguí sacar de internet sin esfuerzo. Pero la que te voy a contar ahora fue la parte que mas me costó averiguar. Para averiguarlo, tuve que comparar backup’s de la base de datos que saqué antes y después de realizar cambios en la web. Hice la misma operación con bloques reutilizables. Al final entendí en qué consistían estos cambios y cómo se reflejaban en la base de datos.

WordPress hace un uso muy intensivo de la tabla wp_posts. En esta tabla se almacenan tus entradas, tus páginas, las revisiones de cambios… pero además, almacena plantillas personalizadas, bloques reutilizables, y un montón de cosas más. Pero entonces, ¿Cómo sabe WordPress qué es cada cosa?. Pues por el campo post_type.

Identificar posts a modificar

No voy a entrar a explicaros todos los tipos de post que pueden existir en esta tabla, yo no los conozco. Sí os puedo contar que los que debemos de mover al nuevo tema hijo los vais a obtener con la siguiente consulta:

SELECT * FROM wp_posts 
WHERE post_type IN (
  'wp_global_styles', 
  'custom_css', 
  'wp_template',
  'wp_template_part',
  'wp_block',
  'wp_navigation'
);

Ok, pero y ahora, ¿Cómo se mueven al nuevo tema?. Pues veréis, las relaciones de los posts con otras entidades se hacen a través de la tabla wp_term_relationships. Esta tabla relaciona un post con una taxonomía de término, es decir, relaciona los registros de wp_posts con los de wp_term_taxonomy. La tabla wp_term_taxonomy en WordPress se utiliza para almacenar la taxonomía de términos utilizados en el sitio web. En otras palabras, esta tabla organiza y clasifica los términos (como categorías y etiquetas) utilizados en diferentes tipos de contenido (publicaciones, páginas, etc).

Y la pieza que nos falta ahora es la tabla wp_terms. La tabla wp_terms de WordPress se utiliza para almacenar los términos o categorías utilizados en el sitio. Cada término tiene una entrada en esta tabla, que incluye información como el ID del término, el nombre del término y el slug del término. Esta tabla se utiliza principalmente para organizar y clasificar el contenido del sitio, como las categorías, las etiquetas y cualquier otra taxonomía personalizada creada en WordPress.

Podéis hacer una select de la tabla wp_terms y veréis que hay una entrada con el nombre del tema padre, y que esta entrada está relacionada con la taxonomía wp_theme en la tabla wp_term_taxonomy.

Modificando relaciones de los posts

Por lo tanto, lo que vamos a hacer es cambiar las relaciones de los posts que consultamos anteriormente a un nuevo término que representará a nuestro tema hijo y que vincularemos a la taxonomía wp_theme. Primero averiguamos cuál es el siguiente id para la tabla wp_terms con esta select:

SELECT MAX(term_id)+1 FROM wp_terms;

Con el nuevo id calculado, ahora insertaremos el nuevo término y su relación con la taxonomía. En mi caso, el id obtenido fue el 126. Y el 10 que le estoy añadiendo, pues es el mismo valor que tenía el registro del tema padre, así que lo copié.

INSERT INTO wp_terms(term_id, name, slug, term_group)
VALUES(126, 'twentytwentythree-child', 'twentytwentythree-child', 0);

INSERT INTO wp_term_taxonomy(term_taxonomy_id, term_id, taxonomy, description, parent, count)
VALUES(126,126, 'wp_theme', '', 0, 10);

Ahora lo que hacemos es cambiar las relaciones con taxonomía de todos los posts que vimos al principio. Pasarán de apuntar a la taxonomía del tema padre (que en mi caso, tenía el id 2) a apuntar a la nueva taxonomía.

UPDATE wp_term_relationships SET term_taxonomy_id = 126 WHERE term_taxonomy_id = 2;

Modificando referencias internas del post

Ya casi lo tenemos. Si lanzáis de nuevo la consulta de los posts que teníamos que cambiar, podréis ver que en el contenido (campo post_content) de algunos de ellos se hace referencia nominal al anterior tema padre. Esto es un ejemplo de lo que tenía yo:

<!-- wp:template-part {"slug":"header","theme":"twentytwentythree","tagName":"header"} /-->

<!-- wp:group {"tagName":"main","style":{"spacing":{"margin":{"top":"var:preset|spacing|50"}}}} -->
<main class="wp-block-group" style="margin-top:var(--wp--preset--spacing--50)"><!-- wp:group {"layout":{"type":"constrained"}} -->
<div class="wp-block-group"><!-- wp:post-title {"level":1,"style":{"spacing":{"margin":{"bottom":"var:preset|spacing|40"}}}} /--></div>
<!-- /wp:group -->

<!-- wp:post-content {"layout":{"type":"constrained"}} /-->

<!-- wp:template-part {"slug":"comments","theme":"twentytwentythree","tagName":"section"} /--></main>
<!-- /wp:group -->

<!-- wp:template-part {"slug":"footer","theme":"twentytwentythree","tagName":"footer"} /-->

Pues lo que tendremos que hacer es remplazar el nombre del tema padre de estos posts con el nombre del nuevo tema hijo. En mi caso, lo hice con este script:

UPDATE wp_posts 
SET post_content = REPLACE(post_content, '"twentytwentythree"', '"twentytwentythree-child"')
WHERE post_type IN (
  'wp_global_styles', 
  'custom_css', 
  'wp_template',
  'wp_template_part',
  'wp_block',
  'wp_navigation'
);

Y con esto hemos acabado de pasar las modificaciones hechas en el tema padre al nuevo tema hijo. Si estás haciendo uso de caché y se llegaron a cachear las páginas con los errores iniciales del tema hijo, es probable que necesites purgar la caché.

Espero que con esta entrada, le pueda ahorrar a alguien el mal trago que pasé yo. Así que recordad; antes de empezar a trabajar un nuevo sitio WordPress, cread siempre, siempre, siempre, un tema hijo del tema que elijáis. Es un proceso muy simple (aquí tenéis un enlace a la documentación oficial) y más vale prevenir que curar.

Si te gustó, comparte!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Resumen de nuestra política de privacidad

Responsable: Pedro López Llorca. Finalidad: Control de spam y gestión de comentarios. Legitimación: Se requiere tu consentimiento para publicar un comentario. Destinatarios: Tus datos se alojan en los servidores de Hostinger. Derechos: Tienes derecho a acceder, rectificar, limitar y suprimir los datos en la dirección del responsable (en nuestra Política de Privacidad)


El periodo de verificación de reCAPTCHA ha caducado. Por favor, recarga la página.