Contact Form 7 - Заполнение выпадающего списка значениями таксономии

27 сент. 2013 г., 19:19:42
Просмотры: 13.9K
Голосов: 7

В Contact Form 7 можно ли заполнить выпадающий список (Selection List) значениями пользовательской таксономии? Мне нужно, чтобы пользователь мог выбрать категорию из моего пользовательского типа записи.

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

Спасибо за это решение. Можно ли исключить некоторые категории из выпадающего списка с помощью вашего кода?

user1690536 user1690536
4 мар. 2014 г. 14:24:18

Конечно. Вы можете использовать get_terms, который предоставляет множество опций, или даже WP_Query

Howdy_McGee Howdy_McGee
4 мар. 2014 г. 16:41:39

Надеюсь, ребята со Stack Overflow не выгонят нас, сказав что это специфично для WordPress.

Nikhil VJ Nikhil VJ
11 февр. 2018 г. 16:29:15
Все ответы на вопрос 1
1
11

Ниже представлен более современный способ динамического заполнения встроенного выбора с опциями, который легко расширить для поддержки большего функционала.

/**
 * Динамический выпадающий список для Contact Form 7
 * @использование [select name taxonomy:{$taxonomy} ...]
 * 
 * @param Array $tag
 * 
 * @return Array $tag
 */
function dynamic_select_list( $tag ) {

    // Работает только с выпадающими списками
    if( 'select' !== $tag['type'] && ('select*' !== $tag['type']) ) {
        return $tag;
    } else if ( empty( $tag['options'] ) ) {
        return $tag;
    }

    $term_args = array();

    // Перебираем опции для поиска наших пользовательских параметров
    foreach( $tag['options'] as $option ) {

        $matches = explode( ':', $option );

        if( ! empty( $matches ) ) {

            switch( $matches[0] ) {

                case 'taxonomy':
                    $term_args['taxonomy'] = $matches[1];
                    break;

                case 'parent':
                    $term_args['parent'] = intval( $matches[1] );
                    break;

            }
        }

    }

    // Убеждаемся, что у нас есть аргументы для работы
    if( empty( $term_args ) ) {
        return $tag;
    }

    // Объединяем динамические аргументы со статическими
    $term_args = array_merge( $term_args, array(
        'hide_empty' => false,
    ) );

    $terms = get_terms( $term_args );

    // Добавляем термины в значения
    if( ! empty( $terms ) && ! is_wp_error( $term_args ) ) {

        foreach( $terms as $term ) {

            $tag['values'][] = $term->name;

        }

    }

    return $tag;

}
add_filter( 'wpcf7_form_tag', 'dynamic_select_list', 10 );

Ниже представлен устаревший/оригинальный способ сделать это, который следует считать устаревшим.

/** Динамический список для Contact Form 7 **/
/** Использование: [select name term:taxonomy_name] **/
function dynamic_select_list($tag, $unused){ 
    $options = (array)$tag['options'];

    foreach ($options as $option) 
        if (preg_match('%^term:([-0-9a-zA-Z_]+)$%', $option, $matches)) 
            $term = $matches[1];

    // Проверяем, установлен ли тип записи
    if(!isset($term))
        return $tag;

    $taxonomy = get_terms($term, array('hide_empty' => 0));

    if (!$taxonomy)  
        return $tag;

    foreach ($taxonomy as $cat) {  
        $tag['raw_values'][] = $cat->name;  
        $tag['values'][] = $cat->name;  
        $tag['labels'][] = $cat->name;
    }

    $tag['raw_values'][] = 'Другое';  
    $tag['values'][] = 'Другое';  
    $tag['labels'][] = 'Другое - Укажите ниже';

    return $tag; 
}
add_filter( 'wpcf7_form_tag', 'dynamic_select_list', 10, 2);
1 окт. 2013 г. 18:16:32
Комментарии

Это решение подходит, однако начиная с версии WP 4.5 таксономии следует передавать через аргумент 'taxonomy' в массиве $args. $taxonomy = get_terms(array('taxonomy' => $term, 'hide_empty' => false));

5ulo 5ulo
23 сент. 2016 г. 19:26:41