WordPress Customizer - передача значения настройки в другой элемент управления для динамического обновления выпадающего списка

24 авг. 2020 г., 21:28:57
Просмотры: 362
Голосов: 1

В скрипте WordPress Customizer я пытаюсь передать значение из элемента управления select в пользовательский элемент управления, который отображает таксономии, связанные с выбранным значением (первый элемент управления).

$wp_customize->add_control( new Tax_Dropdown_Control( $wp_customize, 'select_tax', array(
    'section'       => 'section_1',
    'label'         => __( 'Выберите таксономию записи', 'textdomain' ),
    'description'   => __( 'Выберите таксономию на основе выбранного типа записи.', 'textdomain' ),
    'dropdown_args' => array(
        'post_type' => $wp_customize->get_setting("select_post_type"), // здесь нужно передать значение из первого элемента управления
    ),
) ) );

// фрагмент кода пользовательского элемента управления
class Tax_Dropdown_Control extends WP_Customize_Control {
    .....    
    $dropdown_args = wp_parse_args( $this->dropdown_args, array(
        'post_type' => 'post',
    ) );
        
    $dropdown_args['echo'] = false;
                
    $taxonomies = get_object_taxonomies($dropdown_args);
                
    if  ($taxonomies) {
        echo '<select>';
        foreach ($taxonomies  as $taxonomy ) {
            echo '<option>'. $taxonomy. '</option>';
        }
        echo '</select>';
    } 
    ....
}

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

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

Как добавить элемент управления select_post_type? Какой код для этого? И что это за echo ($taxonomies), к какому элементу управления/секции они относятся?

Sally CJ Sally CJ
25 авг. 2020 г. 02:20:24

@SallyCJ select_post_type — это элемент управления типа select. Переменная $taxonomies — это код для пользовательского класса элемента управления select_tax в функции render content

730wavy 730wavy
25 авг. 2020 г. 04:53:07
Все ответы на вопрос 2
0

Вы можете использовать JavaScript для захвата выбранной опции и затем сделать Ajax-запрос к REST API, чтобы получить соответствующие записи и обновить второе поле.

4 окт. 2020 г. 23:37:22
0

Кастомайзер работает полностью на стороне клиента, поэтому для получения нового списка таксономий потребуется AJAX-запрос к REST API. Это выполнимо, но довольно сложно. Более простое, но менее элегантное решение — просто включить все выпадающие списки и управлять их отображением. Таким образом, внутри цикла по всем возможным выпадающим спискам у вас будет такой код:

foreach [ возможные выпадающие списки ] {
....
if  ($taxonomies) {
    echo '<select id="' . $taxonomies . '">';
    foreach ($taxonomies  as $taxonomy ) {
        echo '<option>'. $taxonomy. '</option>';
        }
    echo '</select>';
    } 
}

Это приведёт к такому html:

<select id="tax1">
 <option>...</option>
 <option>...</option>
</select>
...
<select id="tax5">
 <option>...</option>
 <option>...</option>
</select>

Затем вы можете использовать id у select, чтобы применить CSS для переключения отображения. Очевидно, вам не нужен такой некрасивый html на рабочем сайте, поэтому следует использовать is_customize_preview, чтобы убедиться, что этот код генерируется только при активном кастомайзере.

5 окт. 2020 г. 12:21:40