如果我正确理解你,你想要两个select
s、 一个用于父术语,另一个用于子术语,将根据父选择动态填充。正当
首先,您需要select
元素。
<select name="parent_term">
<option value=""><?php esc_html_e(\'Selecciona País\', \'eltd-tours\'); ?></option>
<?php echo implode( \'\', my_select_options( my_parent_tax_terms(\'tipo_pais\') ) ); ?>
</select>
<select name="child_term"></select>
下面是我用来让html看起来更干净的助手函数。
function my_parent_tax_terms( string $taxonomy ) {
$terms = get_terms(array(
\'taxonomy\' => $taxonomy,
\'hide_empty\' => false,
\'hierarchical\' => true,
\'orderby\' => \'parent\',
\'fields\' => \'all\',
\'parent\' => \'0\',
) );
return ( $terms && is_array($terms) ) ? $terms: array();
}
function my_select_options( array $terms ) {
$out = array();
foreach ($terms => $term) {
$out[] = sprintf(
\'<option value="%d">%s</option>\',
$term->term_id,
$term->name
);
}
return $out;
}
然后将事件侦听器添加到父项
select
让它填充子术语
select
当父选择更改时。您可以使用jQuery或普通javascript来实现这一点。
jQuery(document).on(\'ready\', function(){
// populate child term select, when parent selection changes
jQuery(\'select[name="parent_term"]\').on(\'change\', function(){
// get child terms select element
var $child_select = jQuery(\'select[name="child_term"]\');
// clear any previous options
jQuery($child_select).empty();
// get new options
var $child_options = get_child_terms_from_admin_ajax_or_WP_REST_or_localized_script();
// loop options to append them to the child select
for (i = 0; i < $child_options.length; i++) {
jQuery($child_select).append(`<option value="${$child_options[i].value}">${$child_options[i].name}</option>`);
}
});
});
请注意,子术语需要来自某个地方。这可能是遗产
admin-ajax, 更加现代
WP REST API, 或者,您甚至可以使用父项及其子项创建一个大型配置数组,然后使用
wp_localize_script().