Select personalizado de Contact Form 7 con valores personalizados
He estado buscando una manera de agregar un campo select al Contact Form con datos personalizados.
El objetivo es tener un formulario donde alguien pueda solicitar información sobre un artículo seleccionándolo mediante un campo select.
Lo que logré descubrir es cómo agregar el campo select personalizado al formulario con un filtro
add_filter('wpcf7_form_tag_data_option', function($n, $options, $args){
// ¿Se encontró la etiqueta especial del proveedor de datos?
if (in_array('press_posts', $options)){
$data = array('Test1', 'Test2', 'Test3');
return $data;
}
// por defecto - no aplicar cambios en las opciones
return null;
}, 10, 3);
Ahora solo tengo que agregar el siguiente shortcode al formulario
[select press_post include_blank id:press_select data:press_posts]
El único problema que tengo con esto es que resulta en el siguiente HTML.
<select name="press_post" class="wpcf7-form-control wpcf7-select" id="press_select">
<option value="">---</option>
<option value="Test1">Test1</option>
<option value="Test2">Test2</option>
<option value="Test3">Test3</option>
</select>
Como pueden ver el valor Test1
tiene una letra mayúscula al igual que los otros.
Esto es algo que no quiero y me gustaría establecer el valor yo mismo.
Intenté agregar claves al array de datos pero eso no hizo nada.
Espero que puedan ayudarme.
**** EDICIÓN ****
Actualmente lo tengo funcionando de una manera algo diferente.
function dynamic_field_values($tag){
if ( $tag['name'] != 'press_post' )
return $tag;
$args = array (
'numberposts' => -1,
'post_type' => 'press_posts',
'orderby' => 'title',
'order' => 'ASC',
);
$custom_posts = get_posts($args);
if ( ! $custom_posts )
return $tag;
foreach ( $custom_posts as $custom_post ) {
$tag['raw_values'][] = $custom_post->post_title;
$tag['values'][] = $custom_post->ID;
$tag['labels'][] = $custom_post->post_title;
}
return $tag;
};
add_filter( 'wpcf7_form_tag', 'dynamic_field_values', 10, 2);
Actualmente solo estoy averiguando cómo puedo obtener más datos en la función para hacer todo esto dinámico.
Si alguien sabe cómo hacer eso, sería genial si pudiera compartir esa información conmigo :)
De todos modos, así es como quiero llamar al campo en Contact Form 7
[contact-form-7 id="9778" title="Press contact" number_of_posts="34" post_type="in_het_nieuws"]
Nota las partes de number_of_posts
y post_type
.
Puedes establecer los valores con el filtro wpcf7_form_tag
y añadir los atributos del shortcode con el filtro shortcode_atts_wpcf7
add_filter("wpcf7_form_tag", function($scanned_tag, $replace){
// Verifica si el campo actual es "press_post"
if ("press_post" === $scanned_tag["name"]) {
// Obtiene el formulario de contacto actual
$contact_form = WPCF7_ContactForm::get_current();
// Obtiene los atributos del shortcode
$number_of_posts = $contact_form->shortcode_attr("number_of_posts");
$post_type = $contact_form->shortcode_attr("post_type");
// Usando $number_of_posts y $post_type aquí
// Define los valores brutos para el campo
$scanned_tag['raw_values'] = [
"number_of_posts \"$number_of_posts\" - post_type \"$post_type\" | val 1",
"Test 2|val 2",
"Test 3|val 3",
];
// Procesa los valores con pipes
$pipes = new WPCF7_Pipes($scanned_tag['raw_values']);
$scanned_tag['values'] = $pipes->collect_befores();
$scanned_tag['pipes'] = $pipes;
}
return $scanned_tag;
}, 10, 2);
add_filter("shortcode_atts_wpcf7", function ($out, $pairs, $atts, $shortcode) {
// Añade los atributos personalizados al output
foreach (["number_of_posts", "post_type"] as $a) {
if (isset($atts[$a])) {
$out[$a] = $atts[$a];
}
}
return $out;
}, 10, 4);
siempre aparece "Test 2" en el código HTML pero CF7 reemplaza el valor con "val 2" en el correo electrónico.

Gracias por la respuesta. Aunque ya lo conseguí funcionar y cambié mi respuesta justo cuando estabas respondiendo, aclaraste algunas cosas que realmente me preguntaba, sobre todo lo de las tuberías (pipes) y la parte de raw_values
. Gracias por eso. Y gracias por tu aporte. Aún me queda un pequeño desafío (explicado en la pregunta actualizada) por si tienes tiempo :) ¡saludos!
