Select personalizzato di Contact Form 7 con valori personalizzati
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
.
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.

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
