在没有提交按钮的情况下在下拉列表中显示分类术语子项

时间:2014-06-19 作者:Troy Templeman

我有一个自定义的帖子类型“Portfolio”,带有自定义分类法“Portfolio Categories”,该分类法中的术语是“Branding”、“Print”、“Web”和“Multimedia”。每一个都有子术语。

我想为每个术语(品牌、印刷、网络和多媒体)显示一个单独的下拉列表,在下拉列表中显示其子术语。选择子术语后,它会立即将您带到子术语的存档,而无需单击提交按钮。

以下代码适用于类别,但我不知道如何修改分类术语。

<li id="categories">
    <h2><?php _e(\'Posts by Category\'); ?></h2>
    <form action="<?php bloginfo(\'url\'); ?>/" method="get">
    <div>
<?php
$select = wp_dropdown_categories(\'show_option_none=Select category&show_count=1&orderby=name&echo=0\');
$select = preg_replace("#<select([^>]*)>#", "<select$1 onchange=\'return this.form.submit()\'>", $select);
echo $select;
?>
    <noscript><div><input type="submit" value="View" /></div></noscript>
    </div></form>
</li>
任何帮助都将不胜感激。

好的,我有以下代码显示子术语链接列表,但需要将其修改为下拉列表。

<?php
$term_id = TERM_ID_HERE;
$taxonomy_name = \'TAXONOMY_NAME_HERE\';
$termchildren = get_term_children( $term_id, $taxonomy_name );

echo \'<ul>\';
foreach ( $termchildren as $child ) {
    $term = get_term_by( \'id\', $child, $taxonomy_name );
    echo \'<li><a href="\' . get_term_link( $child, $taxonomy_name ) . \'">\' .     $term->name . \'</a></li>\';
}
echo \'</ul>\';
?>

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

这实际上是一个很有趣的问题。是的this answer 昨晚,它获得了所有分类法的列表,以及属于该特定分类法的术语列表。其中的代码可以很容易地调整为要执行的操作。

我也尝试了其他方法,在谷歌上搜索想法,我从frankiejarrett.com. 为什么不创建自己的下拉函数,如wp_dropdown_categories, 这对我来说很有意义

这是Frankie解释的

Method #2

这就是方法#2的用武之地。我们必须编写自己的自定义函数来生成下拉列表,以便可以将每个选项值作为slug输出:

下面是自定义下拉函数的函数,用于列出您的术语

function fjarrett_custom_taxonomy_dropdown( $taxonomy ) {
    $terms = get_terms( $taxonomy );
    if ( $terms ) {
        printf( \'<select name="%s" class="postform">\', esc_attr( $taxonomy ) );
        foreach ( $terms as $term ) {
            printf( \'<option value="%s">%s</option>\', esc_attr( $term->slug ), esc_html( $term->name ) );
        }
        print( \'</select>\' );
    }
}
现在可以在模板中调用它,如

<?php fjarrett_custom_taxonomy_dropdown( \'my_custom_taxonomy\' ); ?>
他进一步做了更全面的工作

Expansions on Method #2

如果您是一名编码摇滚明星,您可以通过为更多参数腾出空间来进一步采用方法#2。这将为您提供更多的控制,使其功能更像wp\\u dropdown\\u categories:

function fjarrett_custom_taxonomy_dropdown( $taxonomy, $orderby = \'date\', $order = \'DESC\', $limit = \'-1\', $name, $show_option_all = null, $show_option_none = null ) {
    $args = array(
        \'orderby\' => $orderby,
        \'order\' => $order,
        \'number\' => $limit,
    );
    $terms = get_terms( $taxonomy, $args );
    $name = ( $name ) ? $name : $taxonomy;
    if ( $terms ) {
        printf( \'<select name="%s" class="postform">\', esc_attr( $name ) );
        if ( $show_option_all ) {
            printf( \'<option value="0">%s</option>\', esc_html( $show_option_all ) );
        }
        if ( $show_option_none ) {
            printf( \'<option value="-1">%s</option>\', esc_html( $show_option_none ) );
        }
        foreach ( $terms as $term ) {
            printf( \'<option value="%s">%s</option>\', esc_attr( $term->slug ), esc_html( $term->name ) );
        }
        print( \'</select>\' );
    }
}
您可以将其作为

<?php fjarrett_custom_taxonomy_dropdown( \'my_custom_taxonomy\', \'date\', \'DESC\', \'5\', \'my_custom_taxonomy\', \'Select All\', \'Select None\' ); ?>
我希望所有这些都有助于实现你的目标

EDIT

要获得一个术语的子项,您应该使用get_term_children. 我修改了示例中的代码,使其在下拉列表中工作

<form action="<?php bloginfo(\'url\'); ?>/" method="get">

<?php
$term_id = 118;
$taxonomy_name = \'event_cat\';
$termchildren = get_term_children( $term_id, $taxonomy_name );

echo \'<select name="\' . $taxonomy_name . \'" onchange="this.form.submit()">\';
echo \'<option selected>All terms in \' . $taxonomy_name . \'</option>\';
foreach ( $termchildren as $child ) {
    $term = get_term_by( \'id\', $child, $taxonomy_name );
    $link = get_term_link( $term, $taxonomy_name );
    echo \'<option value="\'.$term->slug.\'"><a href="\' .esc_url( $link ) . \'">\' . $term->name . \'</a></option>\';
}
echo \'</select>\';
?> 
<noscript><div><input type="submit" value="View" /></div></noscript>

</form> 

结束