Formulario de contacto 7 (CF7) es uno de los plugins de formulario de contacto más populares para WordPress. Ofrece una variedad de funciones, incluyendo los llamados Etiquetas de correo específicas como [_post_id], [_post_title] o [_post_author_email].
Estas etiquetas especiales pueden utilizarse para recuperar fácilmente información sobre la entrada en la que está incrustado un formulario. Pero, ¿qué ocurre si el formulario está incrustado fuera del contenido de la entrada (por ejemplo, en una barra lateral o en un widget)? Aquí es exactamente donde surge el problema.
![Ohne Anpassungen würden Tags wie [_post_author_email] oder [_post_title] im Contact Form 7 Formular leer bleiben.](/wp-content/uploads/2025/06/msedge_2hXzheRjQb.png)
Por qué necesitábamos y optimizamos nuestro formulario de la barra lateral
Cuando introdujimos nuestro formulario de la barra lateral en Konfuzio, queríamos ofrecer a los lectores una forma más fácil y específica de ponerse en contacto con los autores de nuestros artículos. Para nosotros era especialmente importante que el proceso fuera eficaz y seguro tanto para los lectores como para los autores. A partir de ahí, surgió una tarea apasionante: ¿cómo integrar dinámicamente la dirección de correo electrónico del autor en el formulario sin revelarla públicamente en el frontend?
Por qué el formulario es tan importante para nosotros:
- Contacto directo con el autor/interfaz de contacto para los lectores
A menudo, los lectores tienen preguntas concretas o desean profundizar en el tema tratado en el artículo. Nuestro objetivo era tender un puente directo con los autores de los contenidos, no a través de un sistema anónimo de comentarios, sino mediante una herramienta de comunicación específica y adaptada al contexto. Al mismo tiempo, pudimos evitar que la dirección de correo electrónico del autor fuera directamente visible en el frontend para evitar spam o usos indebidos. - Información específica para la mejora continua de la calidad
Un buen feedback es esencial para crear y seguir desarrollando contenidos de alta calidad. Con este formulario, damos a los lectores la oportunidad no sólo de hacer preguntas directas, sino también de opinar sobre nuestros contenidos. ¿Qué temas les preocupan? ¿Dónde puede haber aún lagunas de información? Estos comentarios se transmiten directamente a nuestros equipos editorial y de autores y contribuyen a mejorar los contenidos a largo plazo. - Activadores para la edición y actualización periódicas de los mensajes
Otro efecto positivo del formulario es que recuerda a nuestros autores que deben revisar sus entradas con regularidad y añadir información actualizada de forma continua. Un lector que solicita o comenta una entrada es señal de que el contenido sigue siendo relevante para nuestro público objetivo. Esto fue suficiente motivación para que trabajáramos en una solución sólida que también permitiera esta función en la barra lateral sin restricciones. - Elogiar y recompensar a los autores comprometidos y los buenos contenidos
Los contenidos que activan a los lectores y fomentan el diálogo directo con los autores son para nosotros una señal de que no sólo estamos desarrollando temas, sino también construyendo relaciones con nuestra comunidad. Dar al autor de un post la oportunidad de tener contacto con lectores motivados es una especie de recompensa por el esfuerzo que ha dedicado al contenido, un incentivo para crear más contenidos de alta calidad.
El reto técnico
Uno de nuestros mayores obstáculos era que Contact Form 7 no incluye un [_post_*]-las etiquetas son compatibles cuando los formularios se integran fuera del contenido de una entrada, como en nuestro caso en la barra lateral. Sin ajustes, etiquetas como [_post_author_email] o [_post_title] permanecen vacías.
Sorteamos este problema con una solución personalizada. Gracias a la integración dinámica del ID de la entrada como campo oculto, pudimos rellenar las etiquetas en el servidor y recuperar de forma segura toda la información contextual. Con esta solución, nuestro formulario también funciona ahora de forma fiable en la barra lateral, y nuestros lectores y autores se benefician por igual de un proceso de comentarios fluido.
Cómo funcionan las etiquetas de correo específicas
El mencionado [_post_*]-las etiquetas en CF7 permiten integrar automáticamente los datos de la entrada en el correo electrónico que se envía cuando se envía el formulario.
Entre ellas figuran:
[_post_id]: Devuelve el ID del mensaje actual.[_post_name]: El slug (nombre) del post.[_post_title]El título del puesto correspondiente.[_post_url]URL de la entrada.[_post_author]Nombre del autor del mensaje.[_post_author_email]Dirección de correo electrónico del autor del mensaje.
En teoría, estas etiquetas son una herramienta inteligente para integrar contenido dinámico en cada entrada sin tener que crear manualmente un formulario distinto para cada entrada.
Problema:
Estos [_post_*]-Sin embargo, las etiquetas funcionan sólosi el formulario forma parte del Contenido está incrustado en el área de contenido. Sin embargo, si el formulario está incrustado en el área de contenido Barra lateralen un widget o en un archivo de tema (como single.php), estas etiquetas especiales Vacío. Esto se debe a que CF7 no reconoce automáticamente el contexto del mensaje fuera del contenido real.
¿Por qué se producen estos problemas?
Contact Form 7 depende de que el formulario se muestre en un entorno en el que la consulta principal de WordPress establezca correctamente la entrada actual. Sin embargo, si un formulario está integrado en una barra lateral o un widget, no hay referencia directa a la consulta principal. En este caso, CF7 no sabe qué entrada se está mostrando y rellena el campo [_post_*]-Por lo tanto, las etiquetas no son suficientes.
Ejemplo: un formulario en la barra lateral
Supongamos que ha creado una entrada de blog con el ID 123 y un formulario CF7 en la barra lateral. El formulario debería tener el título My Blog Post y la dirección de correo electrónico del autor de la entrada. Sin embargo, como el formulario se muestra fuera de la entrada, las etiquetas permanecen como [_post_title] y [_post_author_email] en blanco.
Solución: reconocimiento dinámico del contexto del puesto
Para resolver este problema, podemos utilizar la función Añadir el contexto de la entrada manualmente y en el lado del servidorpara que las etiquetas necesarias funcionen en cualquier entorno, incluso en la barra lateral o en los widgets. Aquí mostramos una solución con dos sencillos pasos:
Paso 1: Añadir el ID del post como campo oculto
En primer lugar, nos aseguramos de que la corriente Identificación postal se añade a cada formulario, independientemente de dónde esté incrustado. Para ello utilizamos el hook wpcf7_form_hidden_fieldspara mostrar un campo oculto con el Post-ID (post_id) en el formulario:
/**
* Add the current post ID as a hidden field in CF7 forms.
*/
add_filter('wpcf7_form_hidden_fields', function ($hidden_fields) {
if (is_singular()) {
global $post;
$post_id = get_queried_object_id() ?: ($post->ID ?? null);
if ($post_id) {
$hidden_fields['post_id'] = absint($post_id); // Ensure the post ID is valid and sanitized.
}
}
return $hidden_fields; // Return the modified hidden fields.
});Explicación:
is_singular()Comprueba si la entrada actual es una página única, una entrada única o un tipo de entrada personalizado.- El Post ID se utiliza como
post_iden el campo$_POSTdel formulario y, por lo tanto, está disponible cuando se procesa el formulario.
Paso 2: Tratamiento dinámico de la _post_*-Etiquetas
Ahora implementaremos un gancho que [_post_*]-etiquetas dinámicamente durante el procesamiento del formulario. Este enfoque comprueba si existe un ID de entrada y los datos correspondientes se recuperan dinámicamente.
/**
* Dynamically populate all _post_* tags using the post ID passed as a hidden field.
*/
add_filter('wpcf7_special_mail_tags', function ($output, $tag_name) {
// Process only _post_* tags.
if (preg_match('/^_post_(id|name|title|url|author|author_email)$/', $tag_name, $matches)) {
// Retrieve the post_id from the hidden fields in the form submission (sent through POST).
$post_id = isset($_POST['post_id']) ? absint($_POST['post_id']) : null;
// If a valid post ID is available, resolve the tag dynamically.
if ($post_id) {
switch ($tag_name) {
case '_post_id':
return $post_id;
case '_post_name':
return get_post_field('post_name', $post_id); // Retrieve the post slug.
case '_post_title':
return get_the_title($post_id);
case '_post_url':
return get_permalink($post_id);
case '_post_author':
$author_id = get_post_field('post_author', $post_id);
return get_the_author_meta('display_name', $author_id);
case '_post_author_email':
$author_id = get_post_field('post_author', $post_id);
$author_email = get_the_author_meta('user_email', $author_id);
return !empty($author_email) ? esc_html($author_email) : 'fallback@example.com';
default:
return $output;
}
}
// Return an empty value if the post ID is not available.
return '';
}
// Default output for tags not matching _post_*.
return $output;
}, 10, 2);Explicación:
- Mediante la integración en
wpcf7_special_mail_tagspodemos tratar cada día de forma individual. - Los datos (
_post_id,_post_author_emailetc.) son en el servidor a partir del Post-ID.
Ejemplo de aplicación
- En la barra lateral:
Vincule el formulario conen la barra lateral:Error: Formulario de contacto no encontrado.
<aside>
<?php echo do_shortcode('[contact-form-7 id="123"]'); ?>
</aside>- Configuración del correo CF7:
Utilice la_post_*-etiquetas en la configuración del correo:
Post ID: [_post_id]
Post Name: [_post_name]
Post Title: [_post_title]
Post URL: [_post_url]
Post Author: [_post_author]
Post Author Email: [_post_author_email]Resultado:
Aunque el formulario está incrustado en la barra lateral, los valores se añaden correctamente.
Conclusión
El uso de etiquetas de correo específicas de la entrada en Contact Form 7 fuera del contenido de la entrada es problemático por defecto. Realizando los ajustes descritos anteriormente, podemos garantizar que todos los datos de correo relevantes también estén disponibles de forma fiable en la barra lateral o en los widgets. Esta solución es respetuosa con la protección de datos, segura y dinámica, y permite a los _post_*-vuelven a funcionar como de costumbre.
