WordPress Workflow: Código Limpio y Duradero con Plugins y Child Themes
Aprende a evitar perder tus cambios en WordPress. Descubre cómo usar plugins de funcionalidad y temas hijo para un código limpio, organizado y duradero.
Desarrollo y Buenas Prácticas en WordPress: Organizando tu Código para el Éxito

En el vasto ecosistema de WordPress, la flexibilidad y la facilidad de uso son sus mayores fortalezas, permitiendo a usuarios de todos los niveles crear y gestionar sitios web robustos. Sin embargo, esta misma flexibilidad puede convertirse en una trampa si no se siguen ciertas buenas prácticas en el desarrollo y la gestión del código personalizado.
La tentación de añadir funcionalidades directamente donde parece más fácil o rápido, sin considerar las implicaciones a largo plazo, es un error clásico que puede llevar a la pérdida de trabajo, problemas de mantenimiento y una experiencia de desarrollo frustrante.
functions.php vs. Plugin de Funcionalidad: Dónde Reside tu Código Crítico
Uno de los errores más comunes y potencialmente devastadores que cometen los desarrolladores, especialmente los principiantes en WordPress, es colocar todo el código personalizado que añade funcionalidades específicas al sitio directamente en el archivo functions.php del tema activo. Si bien este archivo es el lugar designado por WordPress para las funciones específicas del tema, como el registro de menús, barras laterales, soporte para imágenes destacadas o la definición de tamaños de imagen, no está diseñado para albergar lógica de negocio o funcionalidades críticas que van más allá del ámbito estético y estructural del tema. La facilidad de acceso y la aparente inmediatez de ver los cambios reflejados rápidamente pueden llevar a esta práctica, pero sus consecuencias pueden ser severas y, a menudo, descubiertas en el peor momento posible.
El problema fundamental de depender exclusivamente del functions.php del tema para todas las funcionalidades personalizadas es su inherentemente limitada longevidad y alcance. Un tema de WordPress, por su propia naturaleza, es una plantilla de diseño y estructura que define la apariencia visual y la disposición de tu contenido. Los temas están diseñados para ser intercambiables y, crucialmente, para ser actualizados. Cuando cambias de tema, ya sea por una decisión de diseño o para probar una nueva plantilla, el archivo functions.php del tema anterior deja de estar activo. Esto significa que todo el código personalizado que habías escrito, todas esas funciones adicionales, filtros y acciones que daban vida a tu sitio más allá de la apariencia básica, se pierden instantáneamente. Tu sitio puede dejar de funcionar correctamente, las características clave desaparecerán, y la experiencia del usuario se verá gravemente comprometida.
Pero la pérdida de código no se limita solo a un cambio de tema. Incluso si no tienes intención de cambiar de tema, la mayoría de los temas modernos, especialmente los que se adquieren en mercados como ThemeForest o el directorio de temas de WordPress, reciben actualizaciones periódicas. Estas actualizaciones son vitales para la seguridad, la compatibilidad con nuevas versiones de WordPress, la corrección de errores y la adición de nuevas características. Si has modificado directamente el functions.php de un tema padre (que no es un tema hijo), al actualizar ese tema, el archivo functions.php original será sobrescrito por la nueva versión, borrando de nuevo todas tus personalizaciones. Es un escenario común y doloroso que muchos desarrolladores han experimentado, perdiendo horas de trabajo por una práctica inadecuada.
La solución elegante y robusta a este dilema es la creación de un "Site Specific Plugin" o "Plugin de Funcionalidad Específica del Sitio". Este tipo de plugin es, en esencia, un plugin de WordPress normal y corriente, pero con una diferencia clave: está diseñado exclusivamente para tu sitio web en particular. Su propósito es encapsular todas esas funcionalidades personalizadas que no están directamente relacionadas con el diseño o la estructura del tema, pero que son esenciales para el funcionamiento de tu sitio. Esto incluye, por ejemplo, la adición de tipos de publicaciones personalizadas (CPTs), taxonomías personalizadas, shortcodes específicos, integración con APIs externas, ajustes de rendimiento únicos, modificaciones al panel de administración, o cualquier otra lógica de negocio que necesites.
Al trasladar estas funcionalidades a un plugin propio, logras una independencia crítica del tema. El plugin, una vez activado, permanecerá activo independientemente de si cambias de tema o si actualizas el tema actual. Esto significa que tus funcionalidades personalizadas estarán siempre disponibles y activas, proporcionando una base sólida y consistente para tu sitio. Además, un plugin de funcionalidad fomenta una mejor organización del código, permitiendo estructurar las diferentes características en archivos separados dentro del plugin, lo que facilita el mantenimiento, la depuración y la colaboración en proyectos más grandes. Es una inversión de tiempo mínima al principio que ahorra incontables horas de frustración y recuperación de código en el futuro.
La creación de un Site Specific Plugin es sorprendentemente sencilla. Necesitas una carpeta dentro del directorio wp-content/plugins/ y un archivo PHP principal con un encabezado de plugin estándar. Aquí te mostramos un ejemplo básico de cómo se estructura:
<?php
/**
* Plugin Name: Mi Plugin de Funcionalidad del Sitio
* Plugin URI: https://tu-sitio.com
* Description: Un plugin para todas las funcionalidades personalizadas de mi sitio web.
* Version: 1.0.0
* Author: Tu Nombre
* Author URI: https://tu-sitio.com/autor
* License: GPL2
* License URI: https://www.gnu.org/licenses/gpl-2.0.html
* Text Domain: mi-plugin-funcionalidad
*/
// Evitar el acceso directo al archivo
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Ejemplo de código personalizado:
* Registrar un tipo de publicación personalizada (CPT) para "Proyectos".
*/
function registrar_cpt_proyectos() {
$labels = array(
'name' => _x( 'Proyectos', 'Post Type General Name', 'mi-plugin-funcionalidad' ),
'singular_name' => _x( 'Proyecto', 'Post Type Singular Name', 'mi-plugin-funcionalidad' ),
'menu_name' => __( 'Proyectos', 'mi-plugin-funcionalidad' ),
'name_admin_bar' => __( 'Proyecto', 'mi-plugin-funcionalidad' ),
'archives' => __( 'Archivos de Proyectos', 'mi-plugin-funcionalidad' ),
'attributes' => __( 'Atributos del Proyecto', 'mi-plugin-funcionalidad' ),
'parent_item_colon' => __( 'Proyecto Padre:', 'mi-plugin-funcionalidad' ),
'all_items' => __( 'Todos los Proyectos', 'mi-plugin-funcionalidad' ),
'add_new_item' => __( 'Añadir Nuevo Proyecto', 'mi-plugin-funcionalidad' ),
'add_new' => __( 'Añadir Nuevo', 'mi-plugin-funcionalidad' ),
'new_item' => __( 'Nuevo Proyecto', 'mi-plugin-funcionalidad' ),
'edit_item' => __( 'Editar Proyecto', 'mi-plugin-funcionalidad' ),
'update_item' => __( 'Actualizar Proyecto', 'mi-plugin-funcionalidad' ),
'view_item' => __( 'Ver Proyecto', 'mi-plugin-funcionalidad' ),
'view_items' => __( 'Ver Proyectos', 'mi-plugin-funcionalidad' ),
'search_items' => __( 'Buscar Proyectos', 'mi-plugin-funcionalidad' ),
'not_found' => __( 'No se encontraron proyectos', 'mi-plugin-funcionalidad' ),
'not_found_in_trash' => __( 'No se encontraron proyectos en la papelera', 'mi-plugin-funcionalidad' ),
'featured_image' => __( 'Imagen Destacada', 'mi-plugin-funcionalidad' ),
'set_featured_image' => __( 'Establecer imagen destacada', 'mi-plugin-funcionalidad' ),
'remove_featured_image' => __( 'Eliminar imagen destacada', 'mi-plugin-funcionalidad' ),
'use_featured_image' => __( 'Usar como imagen destacada', 'mi-plugin-funcionalidad' ),
'insert_into_item' => __( 'Insertar en proyecto', 'mi-plugin-funcionalidad' ),
'uploaded_to_this_item' => __( 'Subido a este proyecto', 'mi-plugin-funcionalidad' ),
'items_list' => __( 'Lista de proyectos', 'mi-plugin-funcionalidad' ),
'items_list_navigation' => __( 'Navegación de lista de proyectos', 'mi-plugin-funcionalidad' ),
'filter_items_list' => __( 'Filtrar lista de proyectos', 'mi-plugin-funcionalidad' ),
);
$args = array(
'label' => __( 'Proyecto', 'mi-plugin-funcionalidad' ),
'description' => __( 'Tipo de publicación para gestionar proyectos', 'mi-plugin-funcionalidad' ),
'labels' => $labels,
'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt', 'custom-fields' ),
'taxonomies' => array( 'category', 'post_tag' ), // O custom taxonomies
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'menu_position' => 5,
'menu_icon' => 'dashicons-portfolio',
'show_in_admin_bar' => true,
'show_in_nav_menus' => true,
'can_export' => true,
'has_archive' => true,
'exclude_from_search' => false,
'publicly_queryable' => true,
'capability_type' => 'post',
'show_in_rest' => true, // Para el editor de bloques (Gutenberg)
);
register_post_type( 'proyecto', $args );
}
add_action( 'init', 'registrar_cpt_proyectos' );
// Puedes añadir más funciones, filtros y acciones aquí o en archivos separados
// require_once plugin_dir_path( __FILE__ ) . 'includes/mis-shortcodes.php';
// require_once plugin_dir_path( __FILE__ ) . 'admin/mis-opciones-admin.php';
En este ejemplo, el código para registrar un tipo de publicación personalizada (proyecto) se encuentra dentro del plugin. De esta forma, si cambias de tema, tus "Proyectos" seguirán existiendo y siendo accesibles en el panel de administración, y solo necesitarás asegurarte de que tu nuevo tema tenga las plantillas adecuadas para mostrarlos. Esta es la esencia de la separación de preocupaciones: el tema se encarga de la presentación, y el plugin de funcionalidad se encarga de la lógica y los datos.
Para resumir la diferencia fundamental entre ambos enfoques, considera la siguiente tabla:
| Característica | functions.php del Tema Padre |
Plugin de Funcionalidad del Sitio |
|---|---|---|
| Propósito Principal | Funciones específicas del tema (diseño, estructura) | Funcionalidades de negocio, lógica personalizada |
| Persistencia | Depende del tema activo; se pierde al cambiar/actualizar el tema | Independiente del tema; persiste a través de cambios/actualizaciones |
| Mantenimiento | Riesgo de ser sobrescrito, dificulta la depuración | Código modular, fácil de mantener y actualizar |
| Organización | Puede volverse un archivo muy grande y desorganizado | Permite una estructura de directorios y archivos clara |
| Portabilidad | No es portátil; acoplado al tema | Altamente portátil; puede moverse entre sitios (con ajustes) |
| Colaboración | Más difícil de gestionar en equipos | Facilita el trabajo en equipo y el control de versiones |
| Ejemplos de Uso | Registro de menús, sidebars, estilos condicionales | CPTs, taxonomías, shortcodes, APIs, ajustes de admin |
La elección es clara: para cualquier código que no sea estrictamente estético o estructural del tema, un Site Specific Plugin es la práctica recomendada y el camino hacia un desarrollo WordPress más robusto y sostenible.

Guía de Child Themes (Temas Hijo): Por Qué Son Obligatorios
Así como la gestión de funcionalidades debe residir en plugins, la personalización del diseño y la estructura de un tema de WordPress debe hacerse a través de un "Child Theme" o "Tema Hijo". Este concepto es absolutamente fundamental para cualquier desarrollador o usuario que desee modificar un tema existente sin sacrificar la capacidad de actualizarlo de forma segura. Si alguna vez has comprado un tema premium o descargado uno del repositorio de WordPress y has procedido a modificar directamente sus archivos (como style.css, header.php, footer.php, o incluso el functions.php para funciones relacionadas con el diseño), te has expuesto a un riesgo significativo que, tarde o temprano, resultará en la pérdida de todo tu trabajo de personalización.
El escenario es dolorosamente familiar: tienes un sitio web funcionando con un tema atractivo, lo has personalizado a tu gusto con cambios en los estilos, en la estructura de las plantillas o añadiendo pequeños ajustes visuales. De repente, el desarrollador del tema lanza una actualización.
Esta actualización podría contener mejoras de rendimiento, parches de seguridad cruciales, nuevas características o compatibilidad con la última versión de WordPress. Con la mejor de las intenciones, procedes a actualizar el tema desde el panel de administración. ¡Y entonces, sorpresa! Todas tus modificaciones desaparecen. Tu sitio vuelve a la apariencia original del tema, y todas esas horas invertidas en perfeccionar el diseño se han esfumado en un instante.
Esto sucede porque al actualizar un tema, WordPress reemplaza la carpeta completa del tema antiguo por la nueva versión, borrando cualquier archivo modificado o añadido directamente en el tema padre.
Un Tema Hijo resuelve este problema de raíz. Es un tema que hereda la funcionalidad y el estilo de otro tema, conocido como el "Tema Padre" o "Parent Theme". La belleza del Tema Hijo radica en que te permite modificar y extender el tema padre sin alterar sus archivos originales. Todas tus personalizaciones (estilos CSS, plantillas PHP, funciones JavaScript, etc.) residen en el Tema Hijo. Cuando el Tema Padre recibe una actualización, puedes actualizarlo de forma segura sin preocuparte por perder tus cambios, ya que tus modificaciones están aisladas en el Tema Hijo y no se ven afectadas por la actualización del padre. El Tema Hijo simplemente seguirá heredando las nuevas características y correcciones del Tema Padre, mientras mantiene tus personalizaciones intactas.
La obligatoriedad de los Temas Hijo no es una exageración; es una necesidad absoluta para cualquier sitio web en producción que utilice un tema que no ha sido desarrollado por uno mismo desde cero y que, por lo tanto, es susceptible a actualizaciones. Ignorar esta práctica es invitar a la frustración, al retrabajo constante y a la inseguridad en tu sitio. Además, el uso de Temas Hijo facilita la depuración, ya que puedes deshabilitar temporalmente el Tema Hijo para ver si un problema proviene de tus personalizaciones o del Tema Padre, y fomenta un flujo de trabajo más limpio y organizado.
Crear un Tema Hijo manualmente es un proceso sencillo que requiere solo unos pocos pasos y dos archivos principales: style.css y functions.php.
Si te ha sido útil este artículo, compártelo con quien creas que le pueda interesar. ¡Me ayudas a seguir creando contenido!
Pasos para Crear un Tema Hijo Manualmente:
Crear una Carpeta para el Tema Hijo: Dentro del directorio
wp-content/themes/, crea una nueva carpeta para tu Tema Hijo. Es una buena práctica nombrarla siguiendo el patrónnombre-del-tema-padre-child(por ejemplo, si tu tema padre se llamatwentytwentythree, el Tema Hijo podría sertwentytwentythree-child).Crear el Archivo
style.css: Dentro de la carpeta de tu Tema Hijo, crea un archivo llamadostyle.css. Este archivo es crucial porque es el que WordPress utiliza para identificar el tema y, más importante, para declarar su relación con el Tema Padre. El archivostyle.cssdebe contener un encabezado de comentario específico:/* Theme Name: Mi Tema Hijo Twenty Twenty-Three Theme URI: https://tu-sitio.com/ Description: Tema Hijo para el tema Twenty Twenty-Three. Author: Tu Nombre Author URI: https://tu-sitio.com/autor/ Template: twentytwentythree Version: 1.0.0 License: GNU General Public License v2 or later License URI: https://www.gnu.org/licenses/gpl-2.0.html Text Domain: mi-tema-hijo-twentytwentythree */Theme Name: El nombre de tu Tema Hijo que aparecerá en el panel de administración de WordPress.Theme URI: La URL de tu sitio web o del tema.Description: Una breve descripción de tu Tema Hijo.Author: Tu nombre o el de tu organización.Author URI: La URL de tu perfil o sitio web.Template: ¡Este es el campo más importante! Debe ser el nombre exacto de la carpeta del Tema Padre (sensible a mayúsculas y minúsculas). Por ejemplo, si el tema padre está enwp-content/themes/twentytwentythree, entoncesTemplatedebe sertwentytwentythree. Sin este campo, WordPress no sabrá que es un Tema Hijo.Version: La versión de tu Tema Hijo.License,License URI,Text Domain: Información estándar para temas de WordPress.
Crear el Archivo
functions.php: Dentro de la carpeta de tu Tema Hijo, crea un archivo llamadofunctions.php. A diferencia delfunctions.phpdel tema padre, elfunctions.phpde un Tema Hijo se carga además delfunctions.phpdel tema padre. Es decir, no lo sobrescribe, sino que se ejecuta antes. Aquí es donde debes encolar las hojas de estilo del Tema Padre y del Tema Hijo, y donde puedes añadir nuevas funciones o sobrescribir funciones existentes del Tema Padre.El paso más crucial en este
functions.phpes asegurarse de que los estilos del Tema Padre se carguen correctamente antes que los del Tema Hijo, para que tus estilos personalizados en el Tema Hijo puedan sobrescribir los del padre.<?php /** * Encola los estilos del tema padre y del tema hijo. */ function mi_tema_hijo_enqueue_styles() { $parent_style = 'parent-style'; // Esto es un identificador único para el estilo del tema padre. wp_enqueue_style( $parent_style, get_template_directory_uri() . '/style.css' ); wp_enqueue_style( 'child-style', get_stylesheet_directory_uri() . '/style.css', array( $parent_style ), wp_get_theme()->get('Version') ); } add_action( 'wp_enqueue_scripts', 'mi_tema_hijo_enqueue_styles' ); /** * Aquí puedes añadir tus funciones personalizadas para el Tema Hijo. * Por ejemplo, añadir soporte para nuevas características o modificar comportamientos. * Recuerda que las funcionalidades críticas que no son de diseño deben ir en un Site Specific Plugin. */ // Ejemplo: Modificar el texto del footer function mi_tema_hijo_footer_text( $text ) { return '© ' . date('Y') . ' Mi Sitio Web. Todos los derechos reservados.'; } add_filter( 'twenty_twenty_three_footer_text', 'mi_tema_hijo_footer_text' ); // Asegúrate de usar el filtro correcto del tema padreEn este ejemplo,
get_template_directory_uri()apunta a la carpeta del Tema Padre, mientras queget_stylesheet_directory_uri()apunta a la carpeta del Tema Hijo. Al especificararray( $parent_style )como dependencia, garantizamos que elchild-stylese cargue después delparent-style, permitiendo que tus reglas CSS personalizadas prevalezcan.Activar el Tema Hijo: Una vez creados estos archivos, ve al panel de administración de WordPress, a "Apariencia" > "Temas". Deberías ver tu "Mi Tema Hijo Twenty Twenty-Three" listado junto a los demás temas. Actívalo. A partir de este momento, todas las personalizaciones CSS que añadas a
style.cssdel Tema Hijo, o las modificaciones de plantillas que realices (copiando archivos del Tema Padre al Tema Hijo y modificándolos allí), estarán seguras de las actualizaciones del Tema Padre.
Qué Incluir en tu Tema Hijo:
- Estilos CSS personalizados: Cualquier regla CSS que quieras añadir o modificar para cambiar la apariencia de tu sitio. Simplemente añádelas al
style.cssde tu Tema Hijo. - Archivos de plantilla modificados: Si necesitas cambiar la estructura HTML de partes del tema (por ejemplo,
header.php,footer.php,single.php,page.php), copia el archivo original del Tema Padre a la carpeta de tu Tema Hijo, y luego modifica la copia en el Tema Hijo. WordPress siempre buscará primero un archivo de plantilla en el Tema Hijo antes de buscarlo en el Tema Padre. - Funciones PHP relacionadas con el diseño: Si el Tema Padre expone filtros o acciones que te permiten modificar elementos de diseño (como el texto del pie de página, la navegación, etc.), puedes usar el
functions.phpde tu Tema Hijo para engancharte a ellos y realizar tus cambios. - Nuevas plantillas de página o entradas: Puedes crear nuevas plantillas de página o entradas directamente en tu Tema Hijo.
En resumen, la combinación de un Site Specific Plugin para las funcionalidades y un Tema Hijo para las personalizaciones de diseño constituye la base de un flujo de trabajo de desarrollo de WordPress profesional y sostenible. Estas prácticas no solo protegen tu trabajo de personalización y funcionalidad de las actualizaciones y cambios de tema, sino que también promueven un código más limpio, modular y fácil de mantener. Adoptar estos principios desde el inicio de cualquier proyecto de WordPress es una inversión que se amortiza muchas veces a lo largo de la vida útil del sitio, garantizando una experiencia de desarrollo y mantenimiento fluida y sin sobresaltos.
¿Listo para despegar?
Si buscas una web rápida, segura y diseñada para convertir, no busques más. Solicita tu presupuesto sin compromiso y llevemos tu negocio al siguiente nivel.