webentwicklung-frage-antwort-db.com.de

Wie bekomme ich den Category Slug von wp_dropdown_categories?

Ich passe ein Plugin an. Ich brauchte es, um eine Liste der Kategorien in der Hierarchie anzuzeigen, die ich mit allen Funktionen des Plugins arbeiten bekam. Ich verwende wp_dropdown_categories, möchte aber die Liste der Kategorien als ihre Slugs und nicht als ihre Kategorienamen anzeigen. Irgendwelche Vorschläge?

Folgendes habe ich bisher:

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;

Ich habe vergessen zu erwähnen, dass dies für das Admin-Backend ist. Ich habe versucht, mit der Walker-Klasse herumzuspielen, aber ich bin ratlos. Kennen Sie einen anderen Weg, wie dies erreicht werden könnte?

1
Michael Chase

Es gibt ein Argument walker für wp_dropdown_categories(). Es akzeptiert eine Instanz eines benutzerdefinierten Walkers, eine Klasse, die Walker_CategoryDropdown oder die generische Walker erweitert.

Erstellen wir eine solche Klasse. Wir müssen nur eine Methode ändern.

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";
    }
}

Jetzt erstellen wir eine Instanz unserer Klasse ...

$wpse_cat_slug_walker = new WPSE_Cat_Slug_Walker;

... und weiter an die Dropdown-Liste:

$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
    )
);

Beachten Sie, dies ist völlig ungetestet, nur eine Idee, um Ihnen die Richtung zu zeigen. :)

0
fuxia

Ich habe es anders gemacht und funktioniert gut. Hoffe es kann auch helfen:

<?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>
2
Bruno Sousa

Hier ist eine aktualisierte Version der Antwort von @toscho, die getestet wurde und mit WP arbeitet. 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 . ')' : ''
        );

    }
}
0
David Gard