Textauszug für jedes Widget explizit einstellen.

Im letzten Artikel habe ich gezeigt, wie man den Textauszug in Widgets begrenzen kann.

In diesem Artikel zeige ich Euch am Beispiel des Themes Colormag, wie man den Textauszug für jedes einzelne Widget auf der Übersichtsseite festlegen kann.

Wichtig dafür sind zwei Dateien bzw. eine Datei und ein bereits im vorherigen Artikel genutztes Codesnippet. Die Rede ist von der widgets.php im Verzeichnis inc/widgets. Und hier interessiert vor allem die Abschnitte Featured Posts widget Style 1 und Style 2. Los gehts ab ca. Zeile 462.

Im Original sieht der Teil der Datei für die genannten Widgets im Style 1 so aus:

/**
 * 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'];
      ?>
      

id="get_field_id( 'type' ); ?>" name="get_field_name( 'type' ); ?>" value="latest"/>
id="get_field_id( 'type' ); ?>" name="get_field_name( 'type' ); ?>" value="category"/>

' ','name' => $this->get_field_name( 'category' ), 'selected' => $category ) ); ?>

$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 ) ); } echo $before_widget; ?> '. esc_html( $title ) .''; } if( !empty( $text ) ) { ?>

have_posts() ):$get_featured_posts->the_post(); ?> '; } elseif ( $i == 2 ) { echo '
'; } ?>
ID ); $image .= '
'; $image .= ''; $image .= get_the_post_thumbnail( $post->ID, $featured, array( 'title' => esc_attr( $title_attribute ), 'alt' => esc_attr( $title_attribute ) ) ).''; $image .= '
'; echo $image; } ?>

'; } ?> 2 ) { echo '
'; } // Reset Post Data wp_reset_query(); ?>

Für unser Vorhaben benötigen wir eine Variable, wir nennen sie summary. Diese müssen wir an verschiedenen Stellen im Code einsetzen.

Als erstes nach Zeile 17 als Inhalt für die Variable tg_defaults, diese ergänzen wir mit

sanitize_text_field($new_instance['summary']);

Zum zweiten Mal kommt sie dann in nach der 24. Zeile zum Einsatz, in der ihr die Instanz summary zugewiesen wird. Die beiden Zeilen sehen dann wie folgt aus:

$tg_defaults['summary'] = sanitize_text_field($new_instance['summary']);
$summary = $instance['summary'];

Anschließend sorgen wir dafür, das wir im Widget auch einen Bereich haben, in der wir die Länge des Textauszuges eintragen können. Dafür kopieren wir die Zeilen 33 bis 36 und fügen sie nach der 44. Zeile ein. Die Bezeichnung 'number' in den beiden Zeilen nach get_field_id ersetzen wir durch summary, das 'Number of post to display' durch die gewünschte Bezeichnung des Bereichs. Ich habe ihn 'Länge des Textauszugs' genannt.

Natürlich müssen wir auch die Variable nach dem echo-Befehl umbenennen. Für size geben wir einen niedrigen einstelligen Wert ein, da wir ja nur eine Maximal dreistellige Zahl eingeben werden.

Als nächstes müssen wir dem Update-Block eine Zeile zuweisen, die dafür sorgt, das es sich um keine negativen Wert handelt. Das geschieht mit

$instance[ 'summary' ] = absint( $new_instance[ 'summary' ]);

Nun müssen wir der Widget-Funktion sagen, das es eine neue Variable gibt. Nach der Zeile für die Kategorie binden wir die Zeile für den Auszug ein:

$summary = empty( $instance[ 'summary' ] ) ? '' : $instance[ 'summary' ] ;

Nun tauschen wir die reguläre Variable für den Auszug - the_excerpt - gegen die Variable summary und binden gleichzeitig den Codesnippet aus dem letzten Artikel mit ein. Das geschieht im obigen Beispiel in Zeile 140. Diese sieht am Ende dann wie folgt aus:

Im vorherigen Artikel sah der Code so aus:

function excerpt_chars($chars = 100, $echo = TRUE) 
{ 
    global $post; 
 
    $out = strip_tags($post->post_excerpt); 
    $out = substr($out, 0, (int) $chars); 
    if(strlen($post->post_excerpt)>100)
		$out = end_on_word($out) .' …';
    $out = end_on_word($out) . ' …';
    $out = xwp_autop($out); 
 
    if ( $echo ) 
    { 
        echo $out; 
        return; 
    } 
 
    return $out; 
}

Diesen ändern wir nun wie folgt ab:

In der ersten Zeile legen wir für die Variable chars einen Wert fest, nach dessen Überschreiten der Textauszug gekappt und die berühmten drei Punkte angehängt werden sollen. Bei mir im Blog sind das ca. 150 Zeichen.

Den numerischen Wert in der 7. Zeile können wir auch mit $chars ersetzen. So braucht man nur einen Wert ersetzen und keinen 2. Was den Arbeitsaufwand aber ja auch nicht wesentlich vereinfacht.

Entsprechend müssen wir nun auch im Bereich Featured Posts widget für den Style 2 vorgehen. Dann haben wir für die beiden Hauptwidgets des Colormag-Themes die Möglichkeit, für jedes Widget explizit die Länge des Textauszugs festzulegen. Im Beispielbild dunkel unterlegt.

Textauszug für jedes Widget explizit einstellen.
Die Länge des Textauszugs kann für jedes Widget explizit einzeln festgelegt werden.

Letzten Endes sieht der gesamte Code dann so aus:

/**
 * 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']);
      $tg_defaults['summary'] = sanitize_text_field($new_instance['summary']);
	  $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'];
	  $summary = $instance['summary'];
	  ?>
      

id="get_field_id( 'type' ); ?>" name="get_field_name( 'type' ); ?>" value="latest"/>
id="get_field_id( 'type' ); ?>" name="get_field_name( 'type' ); ?>" value="category"/>

' ','name' => $this->get_field_name( 'category' ), 'selected' => $category ) ); ?>

$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 . ''; $after_title = '' . $after_title; } elseif ($category) { $cat_url = get_category_link($category); $before_title = $before_title . ''; $after_title = '' . $after_title; } if ($cat) { $get_featured_posts = new WP_Query( array( 'posts_per_page' => $number, 'cat' => $cat, 'summary' => $summary, $type => 'latest', ) ); } echo $before_widget; ?> '. esc_html( $title ) .''; } if( !empty( $text ) ) { ?>

have_posts() ):$get_featured_posts->the_post(); ?> '; } elseif ( $i == 2 ) { echo '
'; } ?>
ID ); $image .= '
'; $image .= ''; $image .= get_the_post_thumbnail( $post->ID, $featured, array( 'title' => esc_attr( $title_attribute ), 'alt' => esc_attr( $title_attribute ) ) ).''; $image .= '
'; echo $image; } ?>

'; } ?> 2 ) { echo '
'; } // Reset Post Data wp_reset_query(); ?>

4 Gedanken zu „Textauszug für jedes Widget explizit einstellen.“

  1. Hallo,

    interessanter Beitrag! Ich hoffe das der nicht mit dem Problem zusammenhängt das ich dein Feed nicht mehr nutzen kann! Im TTRSS ist es nicht mehr möglich deinen Feed zu nutzen. Bis vor kurzen ging das noch! ^^

    Es kommt der Feed [Unknown]!

    Bin auch nicht mal sicher ob es am https liegt aber eventuell meldet sich ja noch jemand wo es auch nicht geht!

    Antworten
    • Hallo Daniel,

      da sich die Änderungen nur auf das Widget und nicht auf irgendwelche Posts beziehen, kann das mit dem Feed eigentlich nichts zu tun haben.

      Und wenn Du den Feed von diesem Blog meinst, dann liegt der Fehler in der Tat woanders. Denn hier habe ich nichts geändert. Die Änderungen beziehen sich nur auf mein Regionalmagazin.

      Hast Du irgendeine zeitliche Angabe, wie lange das Problem schon besteht? Vielleicht kann ich dann nachvollziehn, was (s)ich geändert hat / habe.

      UPDATE: Es könnte auch daran gelegen haben, das ich W3 Total Cache installiert hatte. Das Plugin ist wieder raus, und das Feed-Problem somit hoffentlich auch.

      Antworten

Schreibe einen Kommentar