Formular personalizat Contact Form 7 select cu valori personalizate
Am căutat o modalitate de a adăuga un câmp select în Contact Form 7 cu date personalizate.
Scopul este de a avea un formular unde cineva poate cere informații despre un articol selectându-l dintr-un câmp select.
Am reușit să aflu cum să adaug câmpul select personalizat în formular folosind un filtru
add_filter('wpcf7_form_tag_data_option', function($n, $options, $args){
// s-a găsit tag-ul special pentru furnizarea datelor?
if (in_array('press_posts', $options)){
$data = array('Test1', 'Test2', 'Test3');
return $data;
}
// implicit - nu aplica nicio modificare opțiunilor
return null;
}, 10, 3);
Acum trebuie doar să adaug următorul shortcode în formular
[select press_post include_blank id:press_select data:press_posts]
Singura problemă pe care o am este că acest lucru generează următorul 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>
După cum puteți vedea, valoarea Test1
are literă mare ca și celelalte.
Acest lucru nu îl doresc și aș vrea să setez eu însumi valoarea.
Am încercat să adaug chei la array-ul de date dar nu a funcționat.
Sper că mă puteți ajuta.
**** EDITARE ****
În prezent am reușit să-l fac să funcționeze într-un mod oarecum diferit.
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);
În prezent lucrez la cum pot obține mai multe date în funcție astfel încât să pot face totul dinamic.
Dacă cineva știe cum să facă asta, ar fi grozav să împărtășească aceste informații cu mine :)
oricum, modul în care vreau să apelez câmpul în Contact Form 7 este astfel
[contact-form-7 id="9778" title="Press contact" number_of_posts="34" post_type="in_het_nieuws"]
Observați părțile number_of_posts
și post_type
.

Puteți seta valorile cu filtrul wpcf7_form_tag
și puteți adăuga atributele shortcode-ului cu filtrul 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");
// folosind $number_of_posts și $post_type aici
$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);
în codul HTML va apărea întotdeauna "Test 2", dar CF7 înlocuiește valoarea cu "val 2" în e-mail.

Mulțumesc pentru răspuns. Deși am reușit să fac să funcționeze și am actualizat răspunsul meu în timp ce tu răspundeai, ai clarificat câteva aspecte la care mă întrebam, în special legate de pipe-uri și partea cu raw_values
. Mulțumesc pentru asta și pentru contribuția ta. Totuși, am rămas cu o mică problemă (explicată în întrebarea actualizată) dacă ai timp :) salutări
