Mehrere Kategorien in einem Widget darstellen

Aus einem 'eindimensionalen' Widget ein zweidimensionales machen

Hinweis: Dieser Beitrag ist älter als ein Jahr und daher vielleicht nicht mehr aktuell.

Meinem Regionalmagazin habe ich in den letzten Tagen ein neues Aussehen verpasst. Ein befreundeter Blogger meinte, das meine Besucherzahlen so niedrig seien, läge unter anderem auch am bisher sehr biederen Aussehen der Seite – aber natürlich nicht nur daran.

Er nannte mir dann ein paar seiner favorisierten Magazin-Themes, da er selbst eines betreibt. Und ich suchte mir dann eines daraus aus. Ironischerweise das gleiche, welches er verwendet.

Nun gab es das Problem, dass das Theme in den Widgets nur Beiträge aus einer Kategorie darstellen kann. Dies wiederum stellt(e) für mich ein Problem dar, weil ich für die Berichterstattung aus dem Umland Lüneburgs verschiedene Kategorien nutze.

Meine Sortierung sieht hier wie folgt aus:

– Landkreis
— Samtgemeinde
—— Gemeinde

In dem Theme konnte ich also nur z. B. Landkreis als Kategorie angeben und es wurden dann natürlich auch nur die Artikel angezeigt, die den gesamten Landkreis betreffen. Alle anderen Artikel fielen unter den Tisch.

Als Vorlage das bisherige Theme verwendet

Also musste ich mit meinen eher minimalen Programmierkenntnissen Hand anlegen. Zum Glück hatte ich aber ein Vorbild für das, was ich umsetzen wollte: Mein bisheriges Magazin-Theme von MHThemes, das in etwas anderer Form auch hier Verwendung findet. Dieses bietet die Darstellung aus verschiedenen Kategorien in einem Widget an.

Ich schaute mir also an, wie das von den Theme-Autoren umgesetzt wurde. Mir fiel auf, das sie eigentlich nur eine Variable mehr verwenden, als das im neuen der Fall ist.

Den Code für die Darstellung bezieht es aus der Datei widgets.php. Diese liegt im inc-Ordner, bei MHThemes nennt man ihn includes.

Im Original sieht die Datei wie folgt aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/**
 * Featured Posts widget
 */
class colormag_featured_posts_widget extends WP_Widget {
 
   function __construct() {
      $widget_ops = array( 'classname' => 'widget_featured_posts widget_featured_meta', 'description' =>__( 'Display latest posts or posts of specific category.' , 'colormag') );
      $control_ops = array( 'width' => 200, 'height' =>250 );
      parent::__construct( false,$name= __( 'TG: Featured Posts (Style 1)', 'colormag' ),$widget_ops);
   }
 
   function form( $instance ) {
      $tg_defaults['title'] = '';
      $tg_defaults['text'] = '';
      $tg_defaults['number'] = 4;
      $tg_defaults['type'] = 'latest';
      $tg_defaults['category'] = '';
      $instance = wp_parse_args( (array) $instance, $tg_defaults );
      $title = esc_attr( $instance[ 'title' ] );
      $text = esc_textarea($instance['text']);
      $number = $instance['number'];
      $type = $instance['type'];
      $category = $instance['category'];
      ?>
      <p><?php _e( 'Layout will be as below:', 'colormag' ) ?></p>
      <div style="text-align: center;"><img src="<?php echo get_template_directory_uri() . '/img/style-1.jpg'?>"></div>
      <p>
         <label for="<?php echo $this->get_field_id('title'); ?>"><?php _e( 'Title:', 'colormag' ); ?></label>
         <input id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" />
      </p>
      <?php _e( 'Description','colormag' ); ?>
      <textarea class="widefat" rows="5" cols="20" id="<?php echo $this->get_field_id('text'); ?>" name="<?php echo $this->get_field_name('text'); ?>"><?php echo $text; ?></textarea>
      <p>
         <label for="<?php echo $this->get_field_id('number'); ?>"><?php _e( 'Number of posts to display:', 'colormag' ); ?></label>
         <input id="<?php echo $this->get_field_id('number'); ?>" name="<?php echo $this->get_field_name('number'); ?>" type="text" value="<?php echo $number; ?>" size="3" />
      </p>
 
      <p><input type="radio" <?php checked($type, 'latest') ?> id="<?php echo $this->get_field_id( 'type' ); ?>" name="<?php echo $this->get_field_name( 'type' ); ?>" value="latest"/><?php _e( 'Show latest Posts', 'colormag' );?><br />
       <input type="radio" <?php checked($type,'category') ?> id="<?php echo $this->get_field_id( 'type' ); ?>" name="<?php echo $this->get_field_name( 'type' ); ?>" value="category"/><?php _e( 'Show posts from a category', 'colormag' );?><br /></p>
 
      <p>
         <label for="<?php echo $this->get_field_id( 'category' ); ?>"><?php _e( 'Select category', 'colormag' ); ?>:</label>
         <?php wp_dropdown_categories( array( 'show_option_none' =>' ','name' => $this->get_field_name( 'category' ), 'selected' => $category ) ); ?>
      </p>
      <?php
   }
 
   function update( $new_instance, $old_instance ) {
      $instance = $old_instance;
      $instance[ 'title' ] = strip_tags( $new_instance[ 'title' ] );
      if ( current_user_can('unfiltered_html') )
         $instance['text'] =  $new_instance['text'];
      else
         $instance['text'] = stripslashes( wp_filter_post_kses( addslashes($new_instance['text']) ) );
      $instance[ 'number' ] = absint( $new_instance[ 'number' ] );
      $instance[ 'type' ] = $new_instance[ 'type' ];
      $instance[ 'category' ] = $new_instance[ 'category' ];
 
      return $instance;
   }
 
   function widget( $args, $instance ) {
      extract( $args );
      extract( $instance );
 
      global $post;
      $title = isset( $instance[ 'title' ] ) ? $instance[ 'title' ] : '';
      $text = isset( $instance[ 'text' ] ) ? $instance[ 'text' ] : '';
      $number = empty( $instance[ 'number' ] ) ? 4 : $instance[ 'number' ];
      $type = isset( $instance[ 'type' ] ) ? $instance[ 'type' ] : 'latest' ;
      $category = isset( $instance[ 'category' ] ) ? $instance[ 'category' ] : '';
 
      if( $type == 'latest' ) {
         $get_featured_posts = new WP_Query( array(
            'posts_per_page'        => $number,
            'post_type'             => 'post',
            'ignore_sticky_posts'   => true
         ) );
      }
      else {
         $get_featured_posts = new WP_Query( array(
            'posts_per_page'        => $number,
            'post_type'             => 'post',
            'category__in'          => $category
         ) );
      }

Wenn das Theme ordentlich programmiert ist, werden die einzelnen Abschnitte der Dateien gut kommentiert. Ich muss also nur nach dem Abschnitt suchen, der so heißt wie das Widget, an dem ich schrauben möchte.

Neue Variable für Umsetzung nötig

In meinem Falle ist es (zunächst) das TG: Featured Post-Widget mit dem Style 1. Denn anschließend sollen ja auch die anderen Wigets wie Sport oder auch – wenn entsprechend Kategorisiert – Kultur entsprechend wiedergegeben werden. Die haben in meinem Falle den Style 2.

Die für die Aufgabe notwendige Variable nenne ich $cat. Als erstes muss ich sie nun initialisieren. Das geschieht, in dem ich nach Zeile 23 eine entsprechende Anweisung einfüge

 $cat = $instance['cat'];

Anschließend erfolgt eine Änderung im Widget selbst, damit die anzuzeigenden Kategorien auch irgendwo eingegeben werden können. Diese Änderung erfolgt durch 2 Zeilen Code, der nach Zeile 44 eingefügt wird und wie folgt ausschaut:

<p>
         <label for="<?php echo $this->get_field_id('cat'); ?>"><?php _e( 'categories to display:', 'colormag' ); ?></label>
         <input id="<?php echo $this->get_field_id('cat'); ?>" name="<?php echo $this->get_field_name('cat'); ?>" type="text" value="<?php echo $cat; ?>" size="30" />
      </p>

Das Widget, das original so ausschaut:

So sieht das Featured Posts-Widget im Originalzustand aus
Das Widget im Originalzustand
schaut jetzt so aus:
Das Widget nach der Code-Änderung
So sieht das Widget mit dem hinzugefügten Code aus

Nun wird die Variable den beiden Funktionen update und widget bzw. den Variablen $new_instance, $old_instance, $args und $instance hinzugefügt, was zu folgendem Ergebnis führt:

function update( $new_instance, $old_instance ) {
      $instance = $old_instance;
      $instance[ 'title' ] = strip_tags( $new_instance[ 'title' ] );
      if ( current_user_can('unfiltered_html') )
         $instance['text'] =  $new_instance['text'];
      else
         $instance['text'] = stripslashes( wp_filter_post_kses( addslashes($new_instance['text']) ) );
      $instance[ 'number' ] = absint( $new_instance[ 'number' ] );
      $instance[ 'type' ] = $new_instance[ 'type' ];
      $instance[ 'category' ] = $new_instance[ 'category' ];
	  $instance[ 'cat' ] = absint( $new_instance[ 'cat' ]);
 
 
      return $instance;
   }
 
   function widget( $args, $instance ) {
      extract( $args );
      extract( $instance );
 
      global $post;
      $title = isset( $instance[ 'title' ] ) ? $instance[ 'title' ] : '';
      $text = isset( $instance[ 'text' ] ) ? $instance[ 'text' ] : '';
      $number = empty( $instance[ 'number' ] ) ? 4 : $instance[ 'number' ];
      $link = empty($instance['link']) ? '' : $instance['link'];
      $type = isset( $instance[ 'type' ] ) ? $instance[ 'type' ] : 'latest' ;
      $category = isset( $instance[ 'category' ] ) ? $instance[ 'category' ] : '';
	  $cat = empty( $instance[ 'cat' ] ) ? '' : $instance[ 'cat' ] ;

Zum Abschluss kommt noch die Abfrage der angegebenen Kategorie(n). Das sind die folgenden Zeilen:

if ($cat) {
	    	$get_featured_posts = new WP_Query( array(
			'posts_per_page' 		=> $number,
			'cat'					=> $cat,
			$type					=> 'latest',
			) );
        }

Das ergibt am Schluss folgenden Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/**
 * Featured Posts widget
 */
class colormag_featured_posts_widget extends WP_Widget {
 
   function __construct() {
      $widget_ops = array( 'classname' => 'widget_featured_posts widget_featured_meta', 'description' =>__( 'Display latest posts or posts of specific category.' , 'colormag') );
      $control_ops = array( 'width' => 200, 'height' =>250 );
      parent::__construct( false,$name= __( 'TG: Featured Posts (Style 1)', 'colormag' ),$widget_ops);
   }
 
   function form( $instance ) {
      $tg_defaults['title'] = '';
      $tg_defaults['text'] = '';
      $tg_defaults['number'] = 4;
      $tg_defaults['type'] = 'latest';
      $tg_defaults['category'] = '';
	  $tg_defaults['cat'] = sanitize_text_field($new_instance['cat']);
      $instance = wp_parse_args( (array) $instance, $tg_defaults );
      $title = esc_attr( $instance[ 'title' ] );
      $text = esc_textarea($instance['text']);
      $number = $instance['number'];
      $type = $instance['type'];
      $category = $instance['category'];
	  $cat = $instance['cat'];
	  ?>
      <p><?php _e( 'Layout will be as below:', 'colormag' ) ?></p>
      <div style="text-align: center;"><img src="<?php echo get_template_directory_uri() . '/img/style-1.jpg'?>"></div>
      <p>
         <label for="<?php echo $this->get_field_id('title'); ?>"><?php _e( 'Title:', 'colormag' ); ?></label>
         <input id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" />
      </p>
      <?php _e( 'Description','colormag' ); ?>
      <textarea class="widefat" rows="5" cols="20" id="<?php echo $this->get_field_id('text'); ?>" name="<?php echo $this->get_field_name('text'); ?>"><?php echo $text; ?></textarea>
      <p>
         <label for="<?php echo $this->get_field_id('number'); ?>"><?php _e( 'Number of posts to display:', 'colormag' ); ?></label>
         <input id="<?php echo $this->get_field_id('number'); ?>" name="<?php echo $this->get_field_name('number'); ?>" type="text" value="<?php echo $number; ?>" size="3" />
      </p>
 
      <p><input type="radio" <?php checked($type, 'latest') ?> id="<?php echo $this->get_field_id( 'type' ); ?>" name="<?php echo $this->get_field_name( 'type' ); ?>" value="latest"/><?php _e( 'Show latest Posts', 'colormag' );?><br />
       <input type="radio" <?php checked($type,'category') ?> id="<?php echo $this->get_field_id( 'type' ); ?>" name="<?php echo $this->get_field_name( 'type' ); ?>" value="category"/><?php _e( 'Show posts from a category', 'colormag' );?><br /></p>
 
      <p>
         <label for="<?php echo $this->get_field_id( 'category' ); ?>"><?php _e( 'Select category', 'colormag' ); ?>:</label>
         <?php wp_dropdown_categories( array( 'show_option_none' =>' ','name' => $this->get_field_name( 'category' ), 'selected' => $category ) ); ?>
      </p>
	  <p>
         <label for="<?php echo $this->get_field_id('cat'); ?>"><?php _e( 'categories to display:', 'colormag' ); ?></label>
         <input id="<?php echo $this->get_field_id('cat'); ?>" name="<?php echo $this->get_field_name('cat'); ?>" type="text" value="<?php echo $cat; ?>" size="30" />
      </p>
		<?php
   }
 
   function update( $new_instance, $old_instance ) {
      $instance = $old_instance;
      $instance[ 'title' ] = strip_tags( $new_instance[ 'title' ] );
      if ( current_user_can('unfiltered_html') )
         $instance['text'] =  $new_instance['text'];
      else
         $instance['text'] = stripslashes( wp_filter_post_kses( addslashes($new_instance['text']) ) );
      $instance[ 'number' ] = absint( $new_instance[ 'number' ] );
      $instance[ 'type' ] = $new_instance[ 'type' ];
      $instance[ 'category' ] = $new_instance[ 'category' ];
	  $instance[ 'cat' ] = absint( $new_instance[ 'cat' ]);
 
 
      return $instance;
   }
 
   function widget( $args, $instance ) {
      extract( $args );
      extract( $instance );
 
      global $post;
      $title = isset( $instance[ 'title' ] ) ? $instance[ 'title' ] : '';
      $text = isset( $instance[ 'text' ] ) ? $instance[ 'text' ] : '';
      $number = empty( $instance[ 'number' ] ) ? 4 : $instance[ 'number' ];
      $link = empty($instance['link']) ? '' : $instance['link'];
      $type = isset( $instance[ 'type' ] ) ? $instance[ 'type' ] : 'latest' ;
      $category = isset( $instance[ 'category' ] ) ? $instance[ 'category' ] : '';
	  $cat = empty( $instance[ 'cat' ] ) ? '' : $instance[ 'cat' ] ;
	  if( $type == 'latest' ) {
         $get_featured_posts = new WP_Query( array(
            'posts_per_page'        => $number,
            'post_type'             => 'post',
            'ignore_sticky_posts'   => true,
		) );
      }
      else {
         $get_featured_posts = new WP_Query( array(
            'posts_per_page'        => $number,
            'post_type'             => 'post',
            'category__in'          => $category,
		) );
      }
 
	  if ($link) {
	        $before_title = $before_title . '<a href="' . esc_url($link) . '" class="widget-title-link">';
	        $after_title = '</a>' . $after_title;
        } elseif ($category) {
        	$cat_url = get_category_link($category);
	        $before_title = $before_title . '<a href="' . esc_url($cat_url) . '" class="widget-title-link">';
	        $after_title = '</a>' . $after_title;
        }
 
	  if ($cat) {
	    	$get_featured_posts = new WP_Query( array(
			'posts_per_page' 		=> $number,
			'cat'					=> $cat,
			$type					=> 'latest',
			) );
        }

Nun funktioniert das Widget so, das aus allen Kategorien unterhalb der Ober-Kategorie – in meinem Fall eben Landkreis – die aktuellsten 5 Artikel angezeigt werden.

Falls ihr also auch so ein Theme habt, in dem ihr für ein Widget nur eine einzelne Kategorie angeben könnt, kann es in ähnlicher Form sicher auch entsprechend umgebaut werden.

Über Marcus 685 Artikel
Ich freue mich über Deinen Besuch auf meinem Blog! Wenn Dir der Artikel gefallen hat, teile ihn doch mit anderen und hinterlasse Deine Meinung.

Hinterlasse jetzt einen Kommentar

Kommentar hinterlassen

E-Mail Adresse wird nicht veröffentlicht.


*


CommentLuv - verlinke einen deiner Blog-Artikel