Настройка выпадающего списка Contact Form 7 с произвольными значениями

14 сент. 2017 г., 10:36:21
Просмотры: 23K
Голосов: 3

Я искал способ добавить поле выбора в 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.

4
Комментарии

К какому фильтру подключается функция dynamic_field_values?

mmm mmm
14 сент. 2017 г. 15:03:35

@mmm Я добавил его в правку. Это wpcf7_form_tag

User User
14 сент. 2017 г. 15:07:49

Я отредактировал свой ответ на ваш второй вопрос

mmm mmm
14 сент. 2017 г. 19:02:24

спасибо за решение

skywind skywind
22 авг. 2024 г. 22:53:49
Все ответы на вопрос 1
1

Вы можете установить значения с помощью фильтра 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" в электронном письме.

14 сент. 2017 г. 14:52:39
Комментарии

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

User User
14 сент. 2017 г. 14:56:19