Respuesta de Grok 4 fast, por si te sirve de ayuda:
¡Hola! Entiendo perfectamente la frustración: cuando no eres dev y tratas de explicar algo técnico a alguien que va por otro camino, se arma un lío. No te preocupes, voy a desglosar esto paso a paso de la forma más clara y sencilla posible, basándome en las mejores prácticas de WordPress, HivePress y JetEngine. No soy un dev contratado, pero como IA con conocimiento actualizado, te doy una solución práctica, escalable y que evita tocar lo nativo de HivePress (nada de volcar datos al CPT "request" vía API, que como dices, es un dolor de cabeza).Resumen del problema y mi enfoque
- Lo que quieres: En la single page del CPT "request" (de HivePress), añadir un enlace/boton que lleve a la single page del CPT "briefing" (de JetEngine). Relación 1:1 entre ellos, generada por n8n.
- Por qué el enfoque del contractor es un lío: Guardar el permalink del briefing en un campo meta del "request" requiere actualizar el CPT nativo de HivePress vía API cada vez, lo que es lento, propenso a errores y abusa el principio de "no tocar lo nativo".
- Mi propuesta:
- Usa la relación nativa de JetEngine para enlazar los CPTs (almacena el ID del "request" en el "briefing", no al revés).
- En n8n, al crear el briefing, asigna la relación (fácil vía API de JetEngine).
- En la single del "request", añade el enlace vía customización de template en HivePress (sin hooks complicados ni child themes). Usa un shortcode simple para generar el enlace dinámicamente, basado en la relación.
- Ventajas: Mantiene todo separado, la API solo toca JetEngine (rápida), y es fácil de mantener/expandir. Si añades más campos al briefing, solo los editas en su template.
Esto se puede hacer en ~1-2 horas por un dev decente. Si necesitas uno nuevo, mira en Upwork o el foro de HivePress con keywords como "HivePress + JetEngine integration". Yo te ayudo con el código base.Paso 1: Configura la relación 1:1 en JetEngine (una vez, en el admin)JetEngine tiene un antiestéticature llamado "Relations" perfecto para esto. No necesitas código aquí.
- Ve a WordPress Admin > JetEngine > Relations > Add New.
- General Settings:
- Name: Algo como "request_briefing" (para macros y tags).
- Parent Object: Selecciona "request" (el CPT de HivePress).
- Child Object: Selecciona "briefing" (tu CPT de JetEngine).
- Relation Type: "One to one".
- Activa "Register controls for parent object" (para ver/editar la relación desde la edición del request, si quieres).
- Opcional: Activa "Allow to create new children from parent" si n8n no lo hace todo.
- Labels: Pon textos amigables, ej. "Briefing relacionado" para el box.
- Meta Fields: Opcional, añade campos extra si necesitas (ej. fecha de generación).
- Guarda. Esto crea una tabla/relación en la BD que JetEngine maneja automáticamente.
En n8n: Cuando crees el briefing vía API de WordPress (usando el endpoint de JetEngine), incluye el campo de relación: {"relations": {"request_briefing": {"parent_id": "{{request_id}}"}}}. La API de JetEngine es rápida y soporta esto nativo. Docs:
Tienes que estar registrado para ver este contenido
.
Paso 2: Crea un shortcode simple para el enlace (en functions.php)Esto va en el functions.php de tu tema (o child theme, para no perderlo en updates). Es código PHP básico, ~10 líneas. El shortcode queryea el briefing relacionado y genera el enlace.
php
Código:
function enlace_briefing_relacionado($atts) {
global $post;
if (!$post || $post->post_type !== 'request') return ''; // Solo en single request
// Query el briefing relacionado vía meta (o usa JetEngine relation query si prefieres)
$briefing_id = get_post_meta($post->ID, '_related_briefing_id', true); // Asume que guardas el ID en meta del request (ver nota abajo)
if (!$briefing_id) return '';
$briefing = get_post($briefing_id);
if (!$briefing || $briefing->post_type !== 'briefing') return '';
$url = get_permalink($briefing->ID);
return '<a href="' . esc_url($url) . '" class="btn btn-primary" target="_blank">Ver Briefing Generado</a>'; // Añade clases CSS para estilo
}
add_shortcode('briefing_link', 'enlace_briefing_relacionado');
Notas:
- Cómo guardar el ID: En n8n, después de crear el briefing, haz una llamada API extra para actualizar el meta del request: update_post_meta($request_id, '_related_briefing_id', $briefing_id). Es una sola llamada ligera al CPT nativo, pero solo el ID (no datos pesados), y solo post-creación. Si odias tocar el request, invierte: guarda el request_id en meta del briefing (_related_request_id), y queryea con get_posts(['post_type' => 'briefing', 'meta_key' => '_related_request_id', 'meta_value' => $post->ID, 'numberposts' => 1]) en el shortcode.
- Mejor con Relations de JetEngine: Si usas la relación full, reemplaza la query con JetEngine's function: $related = Jet_Engine()->relations->get_related_posts('request_briefing', $post->ID); y toma $related[0]->ID. Más robusto, consulta docs de JetEngine para el exacto.
Paso 3: Añade el enlace en la single del "request" (customiza template de HivePress)HivePress permite customizar templates sin tocar core. Es como editar una página con Gutenberg.
- Ve a HivePress > Templates > Add New.
- Title: "Single Request Custom".
- Template: Selecciona "Single Listing" (o "Single Request" si es específico; HivePress trata requests como listings).
- Publica/Guarda. Esto overridea el default.
- Edita el template como una página normal:
- Usa los bloques de HivePress (ej. "Listing Content" para lo existente).
- Añade un Shortcode Block (de Gutenberg) donde quieras el botón, ej. después del contenido: [briefing_link].
- O añade un Button Block y pon el shortcode en el enlace dinámico (o usa HTML personalizado).
- Guarda. ¡Listo! El enlace aparece solo si hay briefing relacionado.
Si usas Elementor para templates, integra el shortcode igual.Posibles mejoras/expansiones
- Estilo: Añade CSS en Apariencia > Personalizar para el botón (ej. .btn-briefing { background: #007cba; }).
- Condicional: Si no hay briefing, muestra "Generando..." o nada.
- Más campos: En la single del briefing (customiza con JetEngine o Elementor), usa dynamic tags de JetEngine para mostrar campos del request relacionado (ej. [jet_rel:request_briefing:title]).
- Seguridad: Asegura que solo usuarios logueados vean el botón, con if (!is_user_logged_in()) return ''; en el shortcode.
Críticas constructivas (como pediste)
- Estás en lo correcto: Evita tocar CPTs nativos; es buena práctica para updates de plugins.
- n8n + API es genial para automatizaciones, pero prueba con webhooks de WordPress para triggers más directos (menos latencia).
- Si esto crece, considera un plugin custom o extension de HivePress (tienen docs para eso). Para dev a medio plazo, busca alguien con experiencia en Crocoblock (JetEngine) + HivePress; hay freelancers en su comunidad.
Si esto no encaja o necesitas tweaks (ej. código ajustado), dame más detalles (captura del error o setup exacto). ¿Quieres que busque un dev recomendado o simule el código en un entorno? ¡Dime!