Select personalizzato di Contact Form 7 con valori personalizzati

14 set 2017, 10:36:21
Visualizzazioni: 23K
Voti: 3

Ho cercato un modo per aggiungere un campo select al Contact Form con dati personalizzati.

L'obiettivo è avere un form dove qualcuno può richiedere informazioni su un articolo selezionandolo tramite un campo select.

Sono riuscito a capire come aggiungere il campo select personalizzato al form con un filtro

add_filter('wpcf7_form_tag_data_option', function($n, $options, $args){
    // trovato tag specifico per il fornitore di dati?
    if (in_array('press_posts', $options)){
        $data = array('Test1', 'Test2', 'Test3');
        return $data;
    }
    // default - non applicare modifiche alle opzioni
    return null;
}, 10, 3);

Ora devo solo aggiungere il seguente shortcode al form

[select press_post include_blank id:press_select data:press_posts]

L'unico problema che ho con questo è che produce il seguente 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>

Come potete vedere il valore Test1 ha una lettera maiuscola come gli altri. Questo è qualcosa che non voglio e vorrei impostare il valore io stesso.

Ho provato ad aggiungere chiavi all'array di dati ma non ha funzionato.

Spero possiate aiutarmi.

**** MODIFICA ****

Attualmente l'ho fatto funzionare in modo leggermente diverso.

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);

Attualmente sto solo cercando di capire come posso ottenere più dati nella funzione per rendere tutto dinamico.

Se qualcuno sa come farlo sarebbe fantastico se potesse condividere queste informazioni con me :)

Comunque, il modo in cui voglio chiamare il campo in Contact Form 7 è questo

[contact-form-7 id="9778" title="Press contact" number_of_posts="34" post_type="in_het_nieuws"]

Nota le parti number_of_posts e post_type.

4
Commenti

in quale filtro colleghi la funzione dynamic_field_values ?

mmm mmm
14 set 2017 15:03:35

@mmm L'ho aggiunto alla modifica. ma è wpcf7_form_tag

User User
14 set 2017 15:07:49

Ho modificato la mia risposta per la tua seconda domanda

mmm mmm
14 set 2017 19:02:24

grazie per la soluzione

skywind skywind
22 ago 2024 22:53:49
Tutte le risposte alla domanda 1
1

Puoi impostare i valori con il filtro wpcf7_form_tag e aggiungere gli attributi degli shortcode con il filtro shortcode_atts_wpcf7

add_filter("wpcf7_form_tag", function($scanned_tag, $replace){


    if ("press_post" === $scanned_tag["name"]) {

        $contact_form = WPCF7_ContactForm::get_current();

        $number_of_posts = $contact_form->shortcode_attr("number_of_posts");
        $post_type = $contact_form->shortcode_attr("post_type");


        // utilizzando $number_of_posts e $post_type qui


        $scanned_tag['raw_values'] = [
            "number_of_posts \"$number_of_posts\" - post_type \"$post_type\" | val 1",
            "Test 2|val 2",
            "Test 3|val 3",
        ];

        $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) {

    foreach (["number_of_posts", "post_type"] as $a) {

        if (isset($atts[$a])) {
            $out[$a] = $atts[$a];
        }

    }

    return $out;

}, 10, 4);

nel codice HTML c'è sempre "Test 2" ma CF7 sostituisce il valore con "val 2" nell'e-mail.

14 set 2017 14:52:39
Commenti

Grazie per la risposta. Anche se ho risolto e modificato la mia risposta proprio mentre rispondevi, hai chiarito alcuni aspetti su cui mi stavo interrogando, in particolare riguardo alle pipe e alla parte raw_values. Grazie per questo. E grazie per il tuo contributo. Rimane comunque una piccola sfida (spiegata nella domanda aggiornata) se avessi tempo :) saluti

User User
14 set 2017 14:56:19