Select personalizado de Contact Form 7 con valores personalizados

14 sept 2017, 10:36:21
Vistas: 23K
Votos: 3

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.

4
Comentarios

¿En qué filtro enganchas la función dynamic_field_values?

mmm mmm
14 sept 2017 15:03:35

@mmm Lo añadí en la edición. pero es wpcf7_form_tag

User User
14 sept 2017 15:07:49

He editado mi respuesta para tu segunda pregunta

mmm mmm
14 sept 2017 19:02:24

gracias por la solución

skywind skywind
22 ago 2024 22:53:49
Todas las respuestas a la pregunta 1
1

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.

14 sept 2017 14:52:39
Comentarios

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!

User User
14 sept 2017 14:56:19