如何从wp_Dropdown_Categories获取类别插件

时间:2012-12-11 作者:Michael Chase

我正在自定义一个插件。我需要它来显示层次结构中的类别列表,这是我使用插件的所有功能得到的。我正在使用wp_dropdown_categories, 但我想将类别列表显示为它们的slug,而不是它们的类别名称。有什么建议吗?

以下是我目前掌握的情况:

function replace_id_for_slug( $option ) {
    $categories = get_categories( "hide_empty=0" );
    preg_match( \'/value="(\\d*)"/\', $option[0], $matches );

    $id = $matches[1];
    $selectID = $nextItem;
    $slug = get_cat_slug( $id );

    foreach ( $categories as $category ) {
        if ( $category->cat_ID == $id ) {

        }
    }
    return preg_replace( "/value=\\"(\\d*)\\"/", "value=\\"$slug\\"", $option[0] );
}

$select = wp_dropdown_categories(
    "hierarchical=1&hide_empty=0&echo=0&name=field_$nextItem&id=$selectID&class=categoriesBox"
);

echo $select;
我忘了提到这是用于管理后端的。我试过和沃克班的同学一起玩,但我不知所措。你知道还有什么其他方法可以做到这一点吗?

3 个回复
最合适的回答,由SO网友:fuxia 整理而成

有一个论点walker 对于wp_dropdown_categories(). 它接受一个自定义walker的实例,一个扩展Walker_CategoryDropdown 或通用Walker.

让我们创建这样一个类。我们只需要改变一种方法。

class WPSE_Cat_Slug_Walker extends Walker_Category
{   function start_el( &$output, $category, $depth, $args, $id = 0 ) {
        $pad = str_repeat(\' \', $depth * 3);

        $output .= "\\t<option class=\\"level-$depth\\" value=\\"".$category->term_id."\\"";
        if ( $category->term_id == $args[\'selected\'] )
            $output .= \' selected="selected"\';
        $output .= \'>\';
        $output .= $pad.$category->slug; // The Slug!
        if ( $args[\'show_count\'] )
            $output .= \'&nbsp;&nbsp;(\'. $category->count .\')\';
        $output .= "</option>\\n";
    }
}
现在我们创建一个类的实例…

$wpse_cat_slug_walker = new WPSE_Cat_Slug_Walker;
…并将其传递给下拉列表:

$select = wp_dropdown_categories(
    array (
        \'hierarchical\' => 1,
        \'hide_empty\'   => 0,
        \'echo\'         => 0,
        \'name\'         => "field_$nextItem",
        \'id\'           => $selectID,
        \'class\'        => \'categoriesBox\',
        \'walker\'       => $wpse_cat_slug_walker // the walker
    )
);
注意,这完全没有经过测试,只是一个给你指明方向的想法。:)

SO网友:Bruno Sousa

我用另一种方式做了,效果很好。希望也能有所帮助:

<?php wp_dropdown_categories( \'taxonomy=my_taxonomy&value_field=slug\' ); ?>

    <script type="text/javascript">
        <!--
        var dropdown = document.getElementById("cat");
        function onCatChange() {
            if ( dropdown.options[dropdown.selectedIndex].value != -1 ) {
                location.href = "<?php echo esc_url( home_url( \'/\' ) ); ?>category/"+dropdown.options[dropdown.selectedIndex].value;
            }
        }
        dropdown.onchange = onCatChange;
        -->
    </script>

SO网友:David Gard

这是@toscho提供的答案的更新版本,经过测试并使用WP 4.1.1。

class FGW_Cat_Slug_Walker extends Walker_CategoryDropdown{

    public function start_el(&$output, $category, $depth = 0, $args = array(), $id = 0){

        $pad = str_repeat(\'&nbsp;\', $depth * 3);    // Create the padding (before nested terms)

        /** Generate the HTML for this option */
        $output.= sprintf("\\t".
            \'<option class="%1$s" value="%2$s" %3$s>%4$s%5$s</option>\',
            /** %1$s - \'class\' attribute */     \'level-\' . $depth,
            /** %2$s - \'value\' attribute */     $category->slug,
            /** %3$s - \'selected\' attribute */  ($category->slug == $args[\'selected\']) ? \' selected="selected"\' : \'\',
            /** %4$s - option text */           $category->name,
            /** %5$s - The term count */        ($args[\'show_count\']) ? \'&nbsp;&nbsp;(\' . $category->count . \')\' : \'\'
        );

    }
}

结束