Настройка выпадающего списка Contact Form 7 с произвольными значениями
Я искал способ добавить поле выбора в Contact Form с пользовательскими данными.
Цель состоит в том, чтобы создать форму, где кто-то может запросить информацию о статье, выбрав её из выпадающего списка.
Я выяснил, как добавить пользовательское поле выбора в форму с помощью фильтра
add_filter('wpcf7_form_tag_data_option', function($n, $options, $args){
// найден специальный тег провайдера данных?
if (in_array('press_posts', $options)){
$data = array('Тест1', 'Тест2', 'Тест3');
return $data;
}
// по умолчанию - не применять никаких изменений в опциях
return null;
}, 10, 3);
Теперь мне нужно только добавить следующий шорткод в форму
[select press_post include_blank id:press_select data:press_posts]
Единственная проблема, с которой я столкнулся, это то, что это приводит к следующему HTML.
<select name="press_post" class="wpcf7-form-control wpcf7-select" id="press_select">
<option value="">---</option>
<option value="Тест1">Тест1</option>
<option value="Тест2">Тест2</option>
<option value="Тест3">Тест3</option>
</select>
Как видите, значение Тест1
имеет заглавную букву, как и остальные.
Это то, чего я не хочу, и я хотел бы установить значение самостоятельно.
Я пытался добавить ключи в массив данных, но это ничего не дало.
Надеюсь, вы можете мне помочь.
**** РЕДАКТИРОВАНИЕ ****
В настоящее время я заставил это работать немного другим способом.
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);
Сейчас я просто разбираюсь, как получить больше данных в функции, чтобы сделать всё это динамическим.
Если кто-то знает, как это сделать, было бы здорово, если бы вы могли поделиться этой информацией со мной :)
В любом случае, я хочу вызывать поле в Contact Form 7 следующим образом
[contact-form-7 id="9778" title="Press contact" number_of_posts="34" post_type="in_het_nieuws"]
Обратите внимание на части number_of_posts
и post_type
.

Вы можете установить значения с помощью фильтра wpcf7_form_tag
и добавить атрибуты шорткода с помощью фильтра 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");
// используем $number_of_posts и $post_type здесь
$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);
В HTML-коде всегда отображается "Test 2", но CF7 заменяет это значение на "val 2" в электронном письме.

Спасибо за ответ. Хотя у меня уже получилось заставить это работать, и я изменил свой ответ как раз в тот момент, когда вы отвечали, вы действительно прояснили некоторые моменты, о которых я действительно задумывался. Касательно пайпов и части про raw_values
. Спасибо за это. И спасибо за ваши пояснения. У меня остался небольшой вопрос (описанный в обновлённом вопросе), если у вас найдётся время :) cheers
