Cómo crear relaciones entre Custom Post Types

Contents

Introducción

En el desarrollo de sitios WordPress avanzados es muy común trabajar con Custom Post Types (CPT) para separar contenidos de diferentes naturalezas: por ejemplo, proyectos, testimonios o eventos. Sin embargo, cuanto más crece la complejidad, antes o después surge la necesidad de relacionar uno o varios CPT entre sí. Este artículo ofrece un panorama completo y detallado de cómo crear relaciones entre Custom Post Types en WordPress.

¿Por qué relacionar Custom Post Types

  • Modelo de datos más rico: Permite reflejar entidades reales (por ejemplo, libros y autores).
  • Navegación y UX mejoradas: El usuario puede explorar contenidos vinculados sin cargar la base de datos con consultas complejas.
  • Consultas más eficientes: Al centralizar la lógica de relación, optimizamos el rendimiento y evitamos bucles innecesarios.

Métodos para establecer relaciones

Existen múltiples estrategias, desde soluciones manuales hasta plugins especializados:

Método Complejidad Dependencias Ejemplos
Post Meta manual Media Ninguna add_post_meta(), get_post_meta()
Taxonomías personalizadas Baja Ninguna register_taxonomy()
Plugins especializados Variable Instalación Posts 2 Posts, ACF, Toolset
Tablas personalizadas Alta WPDB CREATE TABLE

1. Usando post meta de manera manual

Este método se basa en añadir metadatos a cada post que apunten al ID de otro. Es simple, pero puede resultar tedioso en grandes volúmenes de datos.


// Guardar relación en el save_post hook
add_action( save_post_proyecto, guardar_relacion_proyecto_autor )
function guardar_relacion_proyecto_autor( post_id ) {
  if ( isset( _POST[autor_id] ) ) {
    update_post_meta( post_id, autor_relacionado, intval( _POST[autor_id] ) )
  }
}

// Obtener proyectos de un autor:
autor_id = 123
query = new WP_Query( array(
  post_type  =gt proyecto,
  meta_key   =gt autor_relacionado,
  meta_value =gt autor_id
) )
    

2. Taxonomías como vínculo

Aunque no es estrictamente una relación de “post a post”, podemos usar taxonomías personalizadas para agrupar CPT de diferentes tipos bajo un mismo término.

  • Crear una taxonomía compartida (por ejemplo, ‘cliente’).
  • Asignar términos a proyectos, facturas, casos de éxito, etc.

Ejemplo rápido de registro:


register_taxonomy( cliente, array( proyecto, factura, caso_exito ), array(
  labels            =gt array( name =gt Clientes ),
  hierarchical      =gt false,
  show_admin_column =gt true
) )
    

3. Plugins especializados

Para relaciones complejas existe software que abstrae la lógica y ofrece interfaces visuales:

Plugin Descripción Enlace
Posts 2 Posts Framework ligero para relaciones many-to-many. GitHub
Advanced Custom Fields Field type Relational para elegir posts relacionados. ACF
Toolset Types Construcción visual de CPT y relaciones. Toolset

3.1. Ejemplo con Posts 2 Posts

  1. Instalar y activar el plugin.
  2. Registrar la conexión en functions.php:
    
    if ( function_exists( p2p_register_connection_type ) ) {
      p2p_register_connection_type( array(
        name       =gt proyectos_a_autores,
        from       =gt proyecto,
        to         =gt autor,
        admin_box  =gt array( show =gt from,to )
      ) )
    }
            

  3. Al editar un proyecto aparecerá un metabox para seleccionar autores.
  4. Para consulta:
    
    p2p_type = p2p_type( proyectos_a_autores )
    connected = p2p_type-gtget_connected( get_the_ID() )
    foreach ( connected as conn ) {
      echo get_the_title( conn-gtto )
    }
            

4. Tablas personalizadas con WPDB

La opción más robusta y performante para grandes volúmenes o relaciones complejas:

  • Crear la tabla en el hook register_activation_hook.
  • Manejar inserciones y consultas con wpdb.

global wpdb
table = wpdb-gtprefix . relaciones_proyecto_autor

sql = CREATE TABLE {table} (
  proyecto_id BIGINT(20) UNSIGNED NOT NULL,
  autor_id    BIGINT(20) UNSIGNED NOT NULL,
  PRIMARY KEY  (proyecto_id, autor_id)
) {wpdb-gtget_charset_collate()}

require_once ABSPATH . wp-admin/includes/upgrade.php
dbDelta( sql )
    

Buenas prácticas

  • Prefijos únicos: usa prefijos en meta keys, tablas y nombres de conexión.
  • Escapa y sanitiza: utiliza esc_sql(), intval(), wp_kses_post() según corresponda.
  • Caching: implementa Transients o objetos cache.
  • Claves de rendimiento: índice de columnas en tablas personalizadas, consultas optimizadas.

Recursos adicionales

Con estas técnicas y ejemplos puedes elegir la que mejor se adapte a tu proyecto y garantizar relaciones sólidas, mantenibles y eficientes.



Acepto donaciones de BAT's mediante el navegador Brave 🙂



Deja una respuesta

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