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?
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 .= ' ('. $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. :)
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>
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(' ', $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']) ? ' (' . $category->count . ')' : ''
);
}
}