tutoriales.com

Creación y Gestión de Custom Post Types y Taxonomías en WordPress

Domina la estructuración de contenidos en WordPress creando tipos de publicaciones y taxonomías personalizadas desde cero mediante código. Aprende a registrarlas correctamente, asociarlas a metadatos y mostrarlas de forma óptima en tu tema.

Intermedio12 min de lectura5 views
Reportar error

Introducción a los Custom Post Types y Taxonomías 🚀

WordPress nació como una plataforma para blogs, lo que significa que su estructura nativa está optimizada para Entradas (Posts) y Páginas (Pages). Sin embargo, cuando desarrollamos sitios web corporativos, portales inmobiliarios, tiendas de comercio electrónico o revistas digitales, las entradas y páginas tradicionales se quedan cortas. Aquí es donde entran en juego los Custom Post Types (CPTs) y las Taxonomías Personalizadas.

Un Custom Post Type te permite crear un tipo de contenido completamente independiente del blog tradicional. Por ejemplo, si estás creando una web de reseñas de cine, tener un CPT llamado "Películas" te permite gestionar actores, directores, sinopsis y valoraciones de forma aislada y estructurada. Por otro lado, las taxonomías personalizadas (como "Género" o "Director") te permiten clasificar estos CPTs de manera lógica, más allá de las categorías y etiquetas predeterminadas.

💡 Consejo: Aunque existen plugins como Custom Post Type UI que facilitan este proceso de forma visual, aprender a registrarlos mediante código te otorga un control absoluto sobre el rendimiento, la portabilidad y la independencia de tu sitio web.

¿Qué son los CPTs y las Taxonomías? 📌

Para entender el funcionamiento avanzado de WordPress bajo el capó, es fundamental definir estos dos conceptos clave:

  • Custom Post Type (CPT): Es un tipo de contenido personalizado que vive en la base de datos de WordPress (en la tabla wp_posts), pero que cuenta con su propio espacio en el escritorio de administración y sus propias URLs.
  • Taxonomía Personalizada: Es un sistema de clasificación que se puede asociar a uno o varios CPTs. Pueden ser de tipo jerárquico (similares a las categorías, donde existen padres e hijos) o no jerárquico (similares a las etiquetas).
WordPress Core Motor del Sistema Base de Datos MySQL / MariaDB CPT Personalizado 'Inmuebles' Taxonomía: Ciudad (Madrid, Barcelona, etc.) Taxonomía: Tipo (Piso, Casa, Local) Gestiona registros Clasifica por Clasifica por

Veamos una tabla comparativa para entender mejor cuándo utilizar elementos nativos frente a elementos personalizados:

Tipo de ContenidoUso RecomendadoCaracterísticas Principales
---------
Entradas (Posts)Artículos de blog, noticias, anuncios.Cronológicos, usan categorías y etiquetas nativas.
Páginas (Pages)Contenido estático (Quiénes Somos, Contacto).Jerárquicas, sin categorías nativas por defecto.
---------
CPTs (Personalizados)Portafolios, productos, inmuebles, eventos.Completamente personalizables, URLs independientes.

Planificación del Proyecto: Nuestro CPT de Ejemplo 🛠️

Para este tutorial, vamos a construir un sistema completo para un sitio web de Gestión de Proyectos Inmobiliarios.

Definiremos los siguientes elementos:

  1. Nombre del CPT: inmueble (singular) / inmuebles (plural).
  2. Soporte: Título, editor, imagen destacada, extracto y campos personalizados.
  3. Taxonomía 1 (Jerárquica): tipo_inmueble (Ej: Apartamento, Casa, Local Comercial).
  4. Taxonomía 2 (No Jerárquica): zona_ciudad (Ej: Norte, Sur, Centro).
🔥 Importante: Nunca agregues código personalizado directamente en los archivos del tema padre, ya que se perderá al actualizarlo. Utiliza siempre un Tema Hijo o, preferiblemente, un Plugin de Funcionalidades Específicas para mantener el código independiente del diseño.

Creación del Custom Post Type paso a paso 💻

El registro de un CPT se realiza mediante la función de WordPress register_post_type(). Esta función debe ejecutarse siempre durante el gancho (hook) init.

Crea un archivo llamado custom-post-types.php (o añádelo a tu plugin de funcionalidades) e introduce el siguiente código:

<?:
/**
 * Plugin Name: Gestor de Inmuebles CPT
 * Description: Registra el CPT Inmuebles y sus taxonomías.
 * Version: 1.0
 * Author: Tu Nombre
 */

function registrar_cpt_inmueble() {
    $labels = array(
        'name'                  => 'Inmuebles',
        'singular_name'         => 'Inmueble',
        'menu_name'             => 'Inmuebles',
        'name_admin_bar'        => 'Inmueble',
        'add_new'               => 'Añadir Nuevo',
        'add_new_item'          => 'Añadir Nuevo Inmueble',
        'new_item'              => 'Nuevo Inmueble',
        'edit_item'             => 'Editar Inmueble',
        'view_item'             => 'Ver Inmueble',
        'all_items'             => 'Todos los Inmuebles',
        'search_items'          => 'Buscar Inmuebles',
        'not_found'             => 'No se encontraron inmuebles.',
        'not_found_in_trash'    => 'No hay inmuebles en la papelera'
    );

    $args = array(
        'label'                 => 'Inmuebles',
        'labels'                => $labels,
        'supports'              => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'),
        'taxonomies'            => array('category', 'post_tag'),
        'public'                => true,
        'show_ui'               => true,
        'show_in_menu'          => true,
        'menu_position'         => 5,
        'menu_icon'             => 'dashicons-building',
        '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, // Vital para habilitar el editor Gutenberg
    );

    register_post_type('inmueble', $args);
}
add_action('init', 'registrar_cpt_inmueble');

Análisis de los argumentos clave:

  • 'supports': Define qué características del editor clásico y de bloques aparecerán en la pantalla de edición. Incluimos thumbnail para permitir imágenes destacadas y custom-fields para metadatos.
  • 'menu_icon': Utilizamos los iconos oficiales de WordPress (Dashicons). En este caso, dashicons-building muestra un edificio.
  • 'show_in_rest' => true: Este parámetro es absolutamente obligatorio si deseas que tu CPT utilice el editor moderno de bloques (Gutenberg) y sea accesible a través de la API REST de WordPress.

Creación de Taxonomías Personalizadas 🗂️

Una vez creado nuestro CPT inmueble, necesitamos clasificar las propiedades. Vamos a registrar dos taxonomías usando la función register_taxonomy(), también enganchada al gancho init.

Añade el siguiente código debajo de la función anterior en tu archivo PHP:

function registrar_taxonomias_inmueble() {
    // Taxonomía Jerárquica (Tipo de Inmueble)
    $labels_tipo = array(
        'name'              => 'Tipos de Inmueble',
        'singular_name'     => 'Tipo de Inmueble',
        'search_items'      => 'Buscar Tipos',
        'all_items'         => 'Todos los Tipos',
        'parent_item'       => 'Tipo Padre',
        'parent_item_colon' => 'Tipo Padre:',
        'edit_item'         => 'Editar Tipo',
        'update_item'       => 'Actualizar Tipo',
        'add_new_item'      => 'Añadir Nuevo Tipo',
        'new_item_name'     => 'Nuevo Nombre de Tipo',
        'menu_name'         => 'Tipos',
    );

    register_taxonomy('tipo_inmueble', array('inmueble'), array(
        'hierarchical'      => true,
        'labels'            => $labels_tipo,
        'show_ui'           => true,
        'show_admin_column' => true,
        'query_var'         => true,
        'rewrite'           => array('slug' => 'tipo-inmueble'),
        'show_in_rest'      => true,
    ));

    // Taxonomía No Jerárquica (Zona / Ciudad)
    $labels_zona = array(
        'name'              => 'Zonas',
        'singular_name'     => 'Zona',
        'search_items'      => 'Buscar Zonas',
        'all_items'         => 'Todas las Zonas',
        'edit_item'         => 'Editar Zona',
        'update_item'       => 'Actualizar Zona',
        'add_new_item'      => 'Añadir Nueva Zona',
        'new_item_name'     => 'Nuevo Nombre de Zona',
        'menu_name'         => 'Zonas',
    );

    register_taxonomy('zona_ciudad', array('inmueble'), array(
        'hierarchical'      => false,
        'labels'            => $labels_zona,
        'show_ui'           => true,
        'show_admin_column' => true,
        'query_var'         => true,
        'rewrite'           => array('slug' => 'zona'),
        'show_in_rest'      => true,
    ));
}
add_action('init', 'registrar_taxonomias_inmueble');
📌 Nota: Al configurar `'hierarchical' => true`, la taxonomía se comportará exactamente igual que las categorías nativas (permitiendo jerarquías). Con `false`, se comportará como las etiquetas.

El Problema Crítico de los Enlaces Permanentes (Permalinks) ⚠️

Cada vez que creas o modificas un Custom Post Type o una taxonomía mediante código, es muy probable que al intentar ver tus páginas o archivos recibas un frustrante Error 404 (Página no encontrada).

Esto ocurre porque las reglas de reescritura (rewrite rules) de WordPress aún no se han actualizado con las nuevas rutas.

¿Cómo solucionarlo?

  1. Ve al panel de administración de WordPress.
  2. Navega hasta Ajustes > Enlaces Permanentes.
  3. Sin cambiar absolutamente nada, desplázate hasta el final de la página y haz clic en el botón Guardar cambios.

Esto forzará a WordPress a vaciar la caché de URLs y regenerar el archivo .htaccess reconociendo tus nuevos CPTs.

Registrar CPT Error 404 Ir a Enlaces Permanentes Guardar Cambios CPT Funcional

Visualización de CPTs en el Tema (Jerarquía de Plantillas) 🎨

WordPress utiliza un sistema jerárquico para decidir qué archivo de plantilla debe mostrar cada tipo de contenido. Si quieres personalizar la apariencia de tus inmuebles y sus taxonomías, puedes crear archivos específicos en la carpeta de tu tema activo:

  • single-inmueble.php: Plantilla para mostrar una propiedad inmobiliaria individual.
  • archive-inmueble.php: Plantilla para mostrar el listado o archivo general de todas las propiedades.
  • taxonomy-tipo_inmueble.php: Plantilla para mostrar los inmuebles filtrados por un tipo específico.

Ejemplo práctico de archive-inmueble.php:

<?:
get_header(); ?>

<main id="primary" class="site-main">
    <header class="page-header">
        <h1 class="page-title">Catálogo de Inmuebles Disponibles</h1>
    </header>

    <?:
    if ( have_posts() ) :
        echo '<div class="inmuebles-grid">';
        while ( have_posts() ) :
            the_post();
            ?>
            <article id="post-<?: the_ID(); ?>" <?: post_class(); ?>>
                <?: if ( has_post_thumbnail() ) : ?>
                    <div class="inmueble-thumb">
                        <a href="<?: the_permalink(); ?>"><?: the_post_thumbnail('medium'); ?></a>
                    </div>
                <?: endif; ?>
                
                <h2 class="entry-title"><a href="<?: the_permalink(); ?>"><?: the_title(); ?></a></h2>
                <div class="entry-summary">
                    <?: the_excerpt(); ?>
                </div>
            </article>
            <?:
        endwhile;
        echo '</div>';

        the_posts_pagination();

    else :
        echo '<p>No se encontraron inmuebles en este momento.</p>';
    endif;
    ?>
</main>

<?:
get_sidebar();
get_footer();

Buenas Prácticas y Consejos Avanzados 🚀

Para cerrar con éxito tu implementación de CPTs y taxonomías, ten en cuenta las siguientes recomendaciones profesionales:

  • Pro Independencia del Tema: Coloca siempre el código de registro de CPTs en un plugin personalizado. Si cambias de tema en el futuro, tus contenidos no desaparecerán.
  • Seguridad Validación y Sanitización: Si decides añadir metadatos adicionales mediante metaboxes personalizados, asegúrate de sanitizar siempre los datos antes de guardarlos en la base de datos.
  • Rendimiento Consultas eficientes: Si utilizas WP_Query para mostrar tus CPTs en páginas personalizadas, recuerda incluir siempre 'no_found_rows' => true y 'update_post_meta_cache' => false si no necesitas paginación ni metadatos complejos, optimizando así las consultas SQL.
Preguntas Frecuentes (FAQ)

¿Puedo cambiar el slug de un CPT después de crearlo? Sí, pero recuerda volver a guardar los enlaces permanentes en el escritorio de WordPress para evitar errores 404.

¿Cómo añado campos personalizados sin programar? Puedes combinar tus CPTs registrados por código con potentes plugins de campos como Advanced Custom Fields (ACF) o Meta Box.


Conclusión

Has aprendido a diseñar, estructurar y registrar un Custom Post Type junto a sus taxonomías personalizadas directamente desde el código en WordPress. Esta habilidad transforma WordPress de un simple gestor de blogs a un potente framework de desarrollo de aplicaciones web a medida. Ahora puedes estructurar cualquier tipo de información de manera limpia, eficiente y perfectamente integrada con el ecosistema de bloques.

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!