Crear tema WordPress desde cero: guía paso a paso

¿Quieres aprender a crear un tema WordPress desde cero? En esta guía te explicamos paso a paso cómo construir tu propia plantilla personalizada, comprender su estructura interna y adaptarla a tus necesidades de diseño o desarrollo. Esta es una habilidad muy valorada para desarrolladores, freelancers y profesionales del diseño web.


Por qué crear tu propio tema WordPress

WordPress ofrece miles de temas gratuitos y premium, pero desarrollar uno propio te permite:

  • Tener control total sobre el diseño y funcionalidades
  • Optimizar el rendimiento según tus necesidades
  • Aprender a fondo cómo funciona WordPress
  • Crear una solución personalizada para clientes

Además, al desarrollar desde cero, podrás implementar prácticas de desarrollo modernas, integrar herramientas externas o usar frameworks CSS como Tailwind o Bootstrap. Así, tu tema será mucho más flexible y escalable.


Requisitos previos para crear tema WordPress personalizado

Antes de empezar, necesitas cumplir algunos requisitos fundamentales:

  • Conocimientos básicos de HTML, CSS y PHP
  • Tener un entorno de desarrollo local (como XAMPP, MAMP o LocalWP)
  • Instalar WordPress en local para hacer pruebas
  • Contar con un editor de código como Visual Studio Code o Sublime Text

Contar con estas herramientas facilitará todo el proceso y te permitirá trabajar con mayor fluidez y seguridad.


Estructura de carpetas de un tema WordPress desde cero

Para crear un tema WordPress desde cero, los archivos básicos indispensables son:

mi-tema/
├── style.css
├── index.php
├── functions.php

style.css – Declaración del tema

Es el archivo que define el nombre del tema y sus metadatos. Debe comenzar con:

/*
Theme Name: Mi Tema
Author: Tu Nombre
Description: Tema personalizado para WordPress
Version: 1.0
*/

Este archivo también puede incluir estilos CSS globales o importar archivos desde otras carpetas, como assets/css/estilos.css para una estructura más organizada.

index.php – Plantilla principal

Es el archivo principal de plantilla. WordPress lo utiliza como fallback si no existen otras plantillas específicas (como single.php o page.php). Aquí puedes definir una estructura HTML básica:

<?php get_header(); ?>

<main>
  <?php
    if ( have_posts() ) :
      while ( have_posts() ) : the_post();
        the_title('<h2>', '</h2>');
        the_content();
      endwhile;
    else :
      echo '<p>No se encontraron publicaciones.</p>';
    endif;
  ?>
</main>

<?php get_footer(); ?>

functions.php – Funcionalidad del tema WordPress

Sirve para añadir funcionalidades al tema como menús, scripts, estilos, widgets, etc.

<?php
function mitema_scripts() {
  wp_enqueue_style('style', get_stylesheet_uri());
  wp_enqueue_script('main-js', get_template_directory_uri() . '/assets/js/main.js', array(), false, true);
}
add_action('wp_enqueue_scripts', 'mitema_scripts');

function mitema_setup() {
  add_theme_support('title-tag');
  add_theme_support('post-thumbnails');
  register_nav_menus(array(
    'main_menu' => 'Menú Principal'
  ));
}
add_action('after_setup_theme', 'mitema_setup');
?>

Archivos comunes para tu tema WordPress desde cero

A medida que desarrollas tu plantilla personalizada, puedes (y debes) incluir archivos que modularicen tu código. Estos son los más comunes y sus respectivos ejemplos:

header.php – Cabecera global del sitio

Contiene el encabezado del sitio, con la apertura del documento HTML, scripts iniciales y navegación principal. Suele usarse en todas las páginas para mantener coherencia.

<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
  <meta charset="<?php bloginfo('charset'); ?>">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
  <header>
    <nav><?php wp_nav_menu(array('theme_location' => 'main_menu')); ?></nav>
  </header>

footer.php – Pie de página del tema WordPress

Incluye el cierre del cuerpo del sitio, scripts adicionales y el pie de página. Se usa justo antes del cierre de </body>.

  <footer>
    <p>&copy; <?php echo date('Y'); ?> - Mi Tema</p>
  </footer>
  <?php wp_footer(); ?>
</body>
</html>

single.php – Entradas individuales

Plantilla para mostrar una entrada del blog. Ideal para mostrar contenido con imagen destacada y comentarios.

<?php get_header(); ?>
<main>
  <?php
    if ( have_posts() ) :
      while ( have_posts() ) : the_post();
        the_title('<h1>', '</h1>');
        the_post_thumbnail();
        the_content();
        comments_template();
      endwhile;
    endif;
  ?>
</main>
<?php get_footer(); ?>

page.php – Plantilla para páginas

Muy similar a single.php pero pensada para páginas estáticas, sin incluir comentarios.

<?php get_header(); ?>
<main>
  <?php
    if ( have_posts() ) :
      while ( have_posts() ) : the_post();
        the_title('<h1>', '</h1>');
        the_content();
      endwhile;
    endif;
  ?>
</main>
<?php get_footer(); ?>

sidebar.php – Widgets y menús laterales

Te permite mostrar contenido adicional como widgets o menús en una barra lateral.

<aside class="sidebar">
  <?php if ( is_active_sidebar('main-sidebar') ) : ?>
    <?php dynamic_sidebar('main-sidebar'); ?>
  <?php endif; ?>
</aside>

404.php – Página de error personalizada

Muestra un mensaje amigable cuando el usuario accede a una URL inexistente.

<?php get_header(); ?>
<main>
  <h1>404 - Página no encontrada</h1>
  <p>Lo sentimos, la página que buscas no existe.</p>
  <a href="<?php echo home_url(); ?>">Volver al inicio</a>
</main>
<?php get_footer(); ?>

archive.php – Archivos por fecha o autor

Es útil para mostrar listas de publicaciones por mes, autor, o tipo de contenido personalizado.

<?php get_header(); ?>
<main>
  <h1><?php the_archive_title(); ?></h1>
  <?php
    if ( have_posts() ) :
      while ( have_posts() ) : the_post();
        echo '<article>';
        the_title('<h2><a href="' . get_permalink() . '">', '</a></h2>');
        the_excerpt();
        echo '</article>';
      endwhile;
    else :
      echo '<p>No hay publicaciones en este archivo.</p>';
    endif;
  ?>
</main>
<?php get_footer(); ?>

category.php – Plantilla para categorías específicas

Permite mostrar entradas de una categoría concreta, con posibilidad de personalizar el diseño de cada una.

<?php get_header(); ?>
<main>
  <h1>Categoría: <?php single_cat_title(); ?></h1>
  <?php
    if ( have_posts() ) :
      while ( have_posts() ) : the_post();
        echo '<article>';
        the_title('<h2><a href="' . get_permalink() . '">', '</a></h2>');
        the_excerpt();
        echo '</article>';
      endwhile;
    else :
      echo '<p>No hay publicaciones en esta categoría.</p>';
    endif;
  ?>
</main>
<?php get_footer(); ?>

Estas plantillas siguen la jerarquía de WordPress y te permiten personalizar cada aspecto del sitio de manera flexible.


Cómo activar tu tema personalizado

  1. Guarda todos los archivos en una carpeta dentro de /wp-content/themes/mi-tema
  2. Ve al panel de WordPress > Apariencia > Temas
  3. Activa tu nuevo tema

Si todo está correcto, tu sitio web ya funcionará con el tema recién creado.


Buenas prácticas al crear tema WordPress

  • Usa funciones nativas de WordPress como the_title(), the_content(), wp_head() y wp_footer() para garantizar compatibilidad.
  • Escapa y sanitiza los datos con funciones como esc_html(), esc_url() o wp_kses().
  • Usa comentarios en el código para facilitar futuras modificaciones.
  • Implementa una estructura de carpetas organizada: /assets/css/, /assets/js/, /template-parts/.
  • Usa get_template_part() para reutilizar bloques como cards, loops o bloques de contenido.
  • Haz que tu tema sea responsive desde el principio usando CSS flexible o frameworks modernos.

Conclusión

Crear un tema WordPress desde cero es una excelente forma de mejorar tus habilidades en desarrollo web. No solo aprenderás cómo está construido un CMS por dentro, sino que también podrás ofrecer soluciones únicas y completamente adaptadas a cada proyecto.

¿Te gustaría que prepare una guía para convertirlo en un tema responsive o compatible con WooCommerce? ¡Cuéntamelo en los comentarios!

Compartir:

Deja una respuesta

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

Tabla de contenidos

Más posts

Categorías

Contáctame

Escríbeme a través del formulario. Estoy encantado de ayudarte con diseño web, contenido visual, redes o cualquier duda.