2016-04-15 9 views
2

Wie kann ich zwingen das Category Widget (Drop-Down-Stil), um die Kategorie Slug statt der? Cat = #?Wordpress Kategorie Widget Drop-Down Slugs

+0

Was ist Ihre Kategorie Slug? Hast du * Category Base * in deine Kategorie geändert? Bitte klären Sie Ihre Frage! – MinhTri

+0

Jede Kategorie. Jeder hat seine eigene Schnecke, und ich habe Tausende von ihnen. Standardmäßig werden in der Anzeige "Category Widget" alle Links zu den Kategorien angezeigt, die über ihren jeweiligen Slug verknüpft sind. Wenn Sie es in Dropdown-Liste statt in Liste ändern, ändern sich alle Kategorien in der Dropdown-Liste zu? Cat = # anstelle des Slugs (/ category/the_slug) – Kevin

+0

Haben Sie die [Permalink Settings] (https: // codex .wordpress.org/Using_Permalinks)? – MinhTri

Antwort

2

Wir können Kraftanzeige tun Standard-Wordpress Kategorie-Widget auf unsere Anforderung außer Kraft zu setzen. Dies ist nicht die beste Methode zum Überschreiben von Standard-Wordpress-Widgets. Es wird am besten sein, neue Widget-Klasse zu registrieren und Methode anzupassen. Ich denke, Sie können die gleiche Widget-Klasse ändern Name, Variablen, ID, um das gleiche wie Standard-Widget, aber anders, es hat keine Auswirkungen auf Standard-Wordpress-Widgets. Unterhalb der Override-Kategorie ändern Sie das Dropdown-Menü für die Änderung des Widgets für die Standardkategorie, wenn dies für Sie hilfreich ist.

<?php 
/* 
* Plugin Name: Test 
*/ 



add_action('widgets_init', 'plugin_prefix_widgets_init'); 

function plugin_prefix_widgets_init(){ 

    register_widget('WP_Widget_Custom_Categories'); 
} 

if(! class_exists('WP_Widget_Categories')) 
include ABSPATH.'wp-includes/widgets/class-wp-widget-categories.php'; 

class WP_Widget_Custom_Categories extends WP_Widget_Categories{ 



    public function widget($args, $instance) { 

     // Apply conditinal tag to sepicific template only. Any other display to remove override widget display. 
     /*if(! is_page('page_slug')){ 
      parent::widget($args, $instance); 
      return; 
     }*/ 


     static $first_dropdown = true; 

     /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */ 
     $title = apply_filters('widget_title', empty($instance['title']) ? __('Categories') : $instance['title'], $instance, $this->id_base); 

     $c = ! empty($instance['count']) ? '1' : '0'; 
     $h = ! empty($instance['hierarchical']) ? '1' : '0'; 
     $d = ! empty($instance['dropdown']) ? '1' : '0'; 

     echo $args['before_widget']; 
     if ($title) { 
      echo $args['before_title'] . $title . $args['after_title']; 
     } 

     $cat_args = array(
      'orderby'  => 'name', 
      'show_count' => $c, 
      'hierarchical' => $h 
     ); 

     if ($d) { 
      $dropdown_id = ($first_dropdown) ? 'cat' : "{$this->id_base}-dropdown-{$this->number}"; 
      $first_dropdown = false; 

      echo '<label class="screen-reader-text" for="' . esc_attr($dropdown_id) . '">' . $title . '</label>'; 

      $cat_args['show_option_none'] = __('Select Category'); 
      $cat_args['id'] = $dropdown_id; 
      $cat_args['value_field'] = 'slug'; 

      if(is_category()) 
      $cat_args['selected'] = get_term(get_query_var('cat'), 'category')->slug ; 

      /** 
      * Filter the arguments for the Categories widget drop-down. 
      * 
      * @since 2.8.0 
      * 
      * @see wp_dropdown_categories() 
      * 
      * @param array $cat_args An array of Categories widget drop-down arguments. 
      */ 
      wp_dropdown_categories(apply_filters('widget_categories_dropdown_args', $cat_args)); 
      ?> 

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

<?php 
     } else { 
?> 
     <ul> 
<?php 
     $cat_args['title_li'] = ''; 

     /** 
     * Filter the arguments for the Categories widget. 
     * 
     * @since 2.8.0 
     * 
     * @param array $cat_args An array of Categories widget options. 
     */ 
     wp_list_categories(apply_filters('widget_categories_args', $cat_args)); 
?> 
     </ul> 
<?php 
     } 

     echo $args['after_widget']; 

    } 

    // Only need to change customize widget method to display as requirement 
} 

Entschuldigung für schlechtes Englisch.

2

Ich habe dies auf Wordpress-Foren gefunden. Es ist ziemlich alt, aber löst Ihr Problem. cat slug in dropdown wp forums

<?php 

function replace_id_for_slug($option){ 
$categories = get_categories("hide_empty=0"); 

preg_match('/value="(\d*)"/', $option[0], $matches); 

$id = $matches[1]; 

$slug = ""; 

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

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

$select = wp_dropdown_categories("hierarchical=1&hide_empty=0&echo=0"); 

$select = preg_replace_callback("#<option[^>]*>[^<]*</option>#", "replace_id_for_slug", $select); 

echo $select; 

?> 

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