Letzte Beiträge einer Kategorie auf einer WordPress Seite anzeigen

Samstag, der 20. Oktober 2007. Veröffentlicht von René.

Hier eine Anleitung, wie man es schafft, dass Wordpress in einem Beitrag, oder auf einer Seite

  • die letzten X Beiträge aller Kategorien oder
  • die letzten X Beiträge einer bestimmten Kategorie oder
  • die letzten X Beiträge einer Kategorie und deren Unterkategorien

anzeigt. Das ganze kann auch auf Autoren eingeschränkt werden.

Hier ein Beispiel wie sowas dann aussieht:

Die letzten fünf technischen Blog-Einträge

ACHTUNG: Mittlerweile habe ich für das Anzeigen von Listen in Beiträgen, Seiten oder Sidebar-Widgets ein WordPress Plugin geschrieben: WordPress Plugin PostLists!

So, und wie geht das jetzt? Zu erst muss das Plugin “Exec-PHP” aktiviert sein (Exec-PHP downloaden und aktivieren), damit PHP-Code in Beiträgen und Seiten ausgeführt wird.
Dann einfach folgenden Code einmal in den Beitrag oder auf die Seite einfügen (bitte den Code-Editor von Wordpress benützen und nicht den visuellen WYGIWYS-Editor):

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
<?php
  if( !function_exists('listposts') )
  {
    function listposts( $headline, $category, $count )
    {
      global $post;
      $post_old = $post;
 
      $posts = get_posts('category='.$category.'&numberposts='.$count.'&offset=0');
 
      if( count($posts)>0 ) :
        echo $headline;
      endif;
 
      if( count($posts)>0 ) :
        echo "<ul>";
      endif;
 
      foreach( $posts as $post ) :
        echo "<li>";
        //the_time('j. m Y');
        //echo ", ";
        //the_time('H:i');
        //echo " Uhr: ";
        echo "<a href='" . get_permalink() . "'>";
        the_title();
        echo "</a>";
        echo "</li>";
      endforeach;
 
      if( count($posts)>0 ) :
        echo "</ul>";
      endif;
 
      $post = $post_old;
    }
  }
?>

Anschließend an der Stelle an der man die Auflistung haben möchte folgende Zeile (auch mehrfach möglich) entsprechend angepasst einfügen:

39
40
41
42
43
44
45
<?php
  listposts( 
    "Die letzten fünf technischen Blog-Einträge", // Titel der Auflistung
    123, // ID der Kategorie
    5 // Anzahl der anzuzeigenden Beiträge
  ); 
?>

Jetzt werden die letzten 5 Beiträge der Kategorie 123 angezeigt - Ohne Unterkategorien.

Wer auch das Datum und die Uhrzeit der Beiträge anzeigen lassen möchte muss in obigem Code folgende Zeilen einkommentieren, also das “//” am Anfang der Zeilen entfernen:

21
22
23
24
    //the_time('j. m Y');
    //echo ", ";
    //the_time('H:i');
    //echo " Uhr: ";

Das sollte dann so aussehen:

21
22
23
24
    the_time('j. m Y');
    echo ", ";
    the_time('H:i');
    echo " Uhr: ";

Wer die letzten Beiträge aus allen Kategorien anzeigen lassen möchte, kann als Kategorie-Id einfach 0 übergeben:

39
40
41
42
43
44
45
<?php
  listposts( 
    "Die letzten fünf Blog-Einträge", // Titel der Auflistung
    0, // Aus allen Kategorien
    5 // Anzahl der anzuzeigenden Beiträge
  ); 
?>

So, und wenn ihr wollt das auch die Beiträge aller Unterkategorien dieser Kategorie angezeigt werden, wird es jetzt etwas komplizierter.
In der Datei “post.php” im Ordner “wp-includes” eurer Wordpress-Installation (Wer sich nicht sicher ist: Bitte voher Backup der Datei anlegen falls etwas schief geht) müssen Änderungen vorgenommen werden. Das ist hier Schritt für Schritt erklärt, die fertige Datei steht hier aber auch zum Download bereit (Bitte bei “Eine fertige post.php-Datei für WordPress 2.3 (deutsch)” weiterlesen).

Hier die Schritt für Schritt Anleitung:
Sucht die Funktion get_posts(…), also diese Zeile:

function get_posts($args) {

Darin müsst ihr das Array $defaults um den Eintrag “categories” erweitern. Aus

  $defaults = array(
    'numberposts' => 5, 'offset' => 0,
    'category' => 0, 'orderby' => 'post_date',
    'order' => 'DESC', 'include' => '',
    'exclude' => '', 'meta_key' => '',
    'meta_value' =>'', 'post_type' => 'post',
    'post_status' => 'publish', 'post_parent' => 0
  );

wird also

  $defaults = array(
    'numberposts' => 5, 'offset' => 0,
    'category' => 0, 'orderby' => 'post_date',
    'order' => 'DESC', 'include' => '',
    'exclude' => '', 'meta_key' => '',
    'meta_value' =>'', 'post_type' => 'post',
    'post_status' => 'publish', 'post_parent' => 0,
    'categories' => 0
  );

(Das Komma nach dem bisher letzten Eintrag nicht vergessen!).
Immernoch in get_posts(…) unter

  $category = (int) $category;

folgende Zeile hinzufügen:

  $categories = (int) $categories;

Und unter

  $category = 0;

folgende Zeile:

  $categories = (int) $categories;

Jetzt unter

  if (!empty($exclusions))
    $exclusions .= ')';

folgende Zeilen einfügen:

  $categories_array = array();
  if( $categories<=0 ) {
    if( $category>0 )
      $categories_array[] = $category;
  }
  else {
    $categories_array[] = $categories;
    foreach( $categories_array as $category ) {
      $category = abs( intval( $category ) );
      if ( $category>0 ) {
        $categories_array = array_merge( $categories_array, get_term_children($category,'category') );
      }
    }
  }

Die Zeile

$query .= empty( $category ) ? '' : ", $wpdb->term_relationships, $wpdb->term_taxonomy  ";

gegen

$query .= count($categories_array)==0 ? '' : ", $wpdb->term_relationships, $wpdb->term_taxonomy  ";

ersetzen, und die Zeile

$query .= empty( $category ) ? '' : "AND ($wpdb->posts.ID = $wpdb->term_relationships.object_id AND $wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id AND $wpdb->term_taxonomy.term_id = " . $category. ") ";

gegen folgende Zeilen ersetzen:

  if( count($categories_array)>0 ) {
    $query .= "AND ( 0 ";
    foreach( $categories_array as $category ) 
      $query .= "OR ($wpdb->posts.ID = $wpdb->term_relationships.object_id AND $wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id AND $wpdb->term_taxonomy.term_id = " . $category. ") ";
    $query .= ") ";      
  }

So, jetzt kann der Funktion get_posts(…) statt “categorie=123″ um die Beiträge der Kategorie 123 aufzulisten, auch “categories=123″ übergeben werden, um auch alle Beiträge der Unterkategorien von Kategorie 123 mit anzuzeigen.
Ach ja, nicht vergessen: Die geänderte Datei wieder auf eurem Webserver abspeichern.

Eine fertige “post.php“-Datei für WordPress 2.3 (deutsch) kann hier heruntergeladen werden (Falls ihr schon andere Änderungen in dieser Datei gemacht habt, würden diese natürlich wieder überschrieben werden sobald ihr die Datei überschreibt):
Dieses Archiv beinhaltet die Datei post.php

Damit auf der Seite dann auch die Beiträge aller Unterkategorien angezeigt werden nur noch im PHP-Code des Beitrags die Zeile

9
  $posts = get_posts('category='.$category.'&numberposts='.$count.'&offset=0');

gegen folgende tauschen:

9
  $posts = get_posts('categories='.$category.'&numberposts='.$count.'&offset=0');

und fertig.

Achtung, nicht getestet (bitte Feedback geben, ob es funktioniert): Wer nur die Beiträge eines bestimmten Autors anzeigen möchte, muss noch folgende Erweiterung in der “post.php“-Datei vornehmen:

Nach

'categories' => 0

noch

, 'author' => 0

anhängen (auf das Komma achten).
Und dann nach

$categories = (int) $categories;

folgende Zeile einfügen:

$author = (int) $author;

Nach

$categories = 0;

noch

$author = 0;

Und dann nach

$query .= empty( $post_status ) ? '' : "AND post_status = '$post_status' ";

noch diese Zeile hinzufügen:

$query .= empty( $author ) ? '' : "AND post_author = $author ";

Jetzt kann man die Funktion listposts(…) wie folgt erweitern:
Aus

4
function listposts( $headline, $category, $count )

wird

4
function listposts( $headline, $author, $category, $count )

und aus

9
  $posts = get_posts('categories='.$category.'&numberposts='.$count.'&offset=0');

muss man

9
  $posts = get_posts('author='.$author.'&categories='.$category.'&numberposts='.$count.'&offset=0');

machen, und schon kann man listposts(…) wie folgt aufrufen:

39
40
41
42
43
44
45
46
<?php
  listposts( 
    "Die letzten fünf technischen Blog-Einträge", // Titel der Auflistung
    1, // ID des Autors
    123, // ID der Kategorie
    5 // Anzahl der anzuzeigenden Beiträge
  ); 
?>

Wenn ihr diese Funktionalität öfters Benötigt lohnt es sich natürlich die Funktion in eine Datei zu verschieben und zu inkludieren statt diese jedes mal neu hinzu zu fügen.

Nachtrag: Da diese Anleitung auf Grund der vielen Varianten jetzt etwas unübersichtlich ist, werde ich vermutlich ein Plugin daraus machen. Dann geht das ganze auch ohne PHP-Exec und kann als Platzhalter in jeden Beitrag und auf jede Seite eingefügt werden. Desshalb am besten in den nächsten Tagen hier nochmal reinklicken ;-)

Nachtrag: Das Plugin ist mittlerweile fertig und steht zum kostenlosen Download zur Verfügung: WordPress Plugin PostLists!


Weiterlesen


Kategorien: WordPress

Stichwörter: , ,

Verwandte Beiträge:

Verlinken


  • TwitThis
  • Technorati
  • Google
  • Yigg
  • Digg
  • MisterWong.DE
  • del.icio.us
  • StumbleUpon
  • Hype
  • Webnews.de
  • blogmarks
  • Spurl
  • Sphinn
  • Simpy
  • blinkbits
  • Furl
  • Blogosphere News
  • Yahoo! Buzz
  • Live
  • MySpace
  • Facebook
  • LinkedIn
  • Wikio
  • YahooMyWeb
  • E-mail this story to a friend!

10 Kommentare zu “Letzte Beiträge einer Kategorie auf einer WordPress Seite anzeigen”

  1. Von Kurzmelder

    Vielen Dank für die Anleitung!

    Da ist ein kleiner Fehler im Bsp. für alle Beiträge aus allen Kategorien anzeigen:

    <?php
      listposts( 
        "Die letzten fünf technischen Blog-Einträge", // Titel der Auflistung
        -1, // Aus allen Kategorien
        5 // Anzahl der anzuzeigenden Beiträge
      ); 
    ?>;

    Wie auch in der Beschreibung geschrieben, sollte der Wert 0 sein.
    Bin kein PHP Experte, hat mich jedoch schon gewundert wieso es nicht funktionierte (für alle Kategorien).

    (ein Plugin wäre echt klasse)

    Antwort: Danke, ich habe den Fehler korrigiert. Das Plugin ist schon in Arbeit :-)

  2. Von marc

    hallo

    schickst du mir das plugin, wenn es fertig gestellt ist? genau sowas könnt ich brauchen. ich suche etwas, wo die beiträge nur zeilenweise angezeigt
    wird (titel ist schon ok) und dann mit klick darauf der ganze beitrag zu lesen ist.
    denke, mit deinem tool könnt das funktionieren.

    lg marc

  3. Von Fabian Schulz

    Ist es irgendwie möglich, den Titel auf nur z.B. 20 Buchstaben zu kürzen?

    Antwort: Ja, mit der Funktion substr(…). Statt dieser Zeile:

    26
    
          the_title();

    folgenden Code verwenden:

    26
    
          echo substr( get_the_title(), 0, 20 ); // den titel ab buchstabe 0 bis 20

    Vielen Dank, ist es dann auch möglich nach dem verküzten Titel “…” zu schreiben?

    Antwort:

    26
    
          echo substr( get_the_title(), 0, 20 ).'...'; // den titel ab buchstabe 0 bis 20 mit ... am Ende
  4. Von dog-on-tour

    Hallo,

    vielen Dank, diese Anleitung war die!! Lösung für mein Problem.
    Leider scheitere ich nun als Laie an der Sortierung der Liste. Ich möchte diese gerne nach den Titeln der Beiträge (diese habe ich durchnummeriert) angezeigt bekommen. Wo und wie lässt sich das ermöglichen?

    VG Saskia.

    Antwort: Um die Beiträge nach Titel zu sortieren, muss folgende Zeile

    9
    
    $posts = get_posts('category='.$category.'&numberposts='.$count.'&offset=0');

    um “&orderby=post_title&order=asc” ergänzt werden:

    9
    
    $posts = get_posts('category='.$category.'&numberposts='.$count.'&offset=0&orderby=post_title&order=asc');
  5. Von dog-on-tour

    Vielen Dank für die schnelle, unkomplizierte und zudem noch funktionierende Hilfe.

  6. Von q1fanty

    Ist das denn auf eine Kategorie beschränkt? Oder geht das auch für mehrere?

    Antwort: Mit dem Plugin “PostLists” von mir, kannst du jetzt auch mehrere Kategorien auswählen (Ab PostLists Version 2.0): In den Expert-Mode wechseln und ins Category-Feld die IDs der Kategorien mit Kommas getrennt eingeben.

  7. Von In Wordpress letzte Beiträge auf Seite anzeigen mit PHP Code

    […] Mit diesem Code wird einText-Link erstellt, der die letzten x aktuellen Beiträge aus allen Kategorien anzeigt. Sowas nennt sich quasi “Neue Beiträge”. […]

  8. Von 2pac

    Das ist so ähnlich wie die letzten Beiträge aus eine Forum anzeigen lassen oder?
    Ich benutze solche Funktionen schon in einigen Systemen wie Joomla z.b. aber für Wordpress war es mir bisher unbekannt! Daher besten dank!

  9. Von Raphael

    Hallo Rene,

    gibt es eine Möglichkeit die ersten 20 Zeichen vom Inhalt des Posts anzeigen zu lassen? Stehe da irgendwie auf dem Schlauch. kann dies evtl. Dein Plug-In?

    Schon mal danke für Deine Mühe.

    Grüßle

    Raphael

    Antwort: Ja, nach dieser Zeile:

    26
    
          the_title();

    folgenden Code einfügen:

          echo ': '.substr( strip_tags($post->post_content), 0, 20 ); // : und den inhalt ohne html tags ab buchstabe 0 bis 20 ausgeben

    Das Plugin kann den kompletten Inhalt, den Inhalt bis zum More-Tag, oder den Excerp ausgeben.

  10. Von liskel

    Hey,
    danke, das ist genial und genau das was ich suchte!
    Außerdem hats mir geholfen weiterhin Einblick in das doch recht verwirrende Wordpress zu gewinnen. Dankeschön :)

Die Kommentare dieser Seite können über folgendes Feed verfolgt werden: Kommentar-Feed dieser Seite

Kommentare per eMail abonnieren

Einen Kommentar schreiben

Bei Fragen zu Software von mir bitte unbedingt die verwendete Version angeben und bei Fragen zu WordPress Plugins bitte zusätzlich auch die Version der WordPress-Installation!
Alle Kommentare werden erst nach manueller Prüfung freigegeben.

Bitte vor dem Absenden des Kommentars die Datenschutzhinweise lesen!