WordPress: Inhalte auf der Startseite steuern

Eine sehr häufige Frage, die ich in den Workshops und E-Mails lese, ist die Frage nach dem wie man die Startseite in WordPress so beeinflussen kann, dass sie sich von den anderen Übersichtsseiten unterscheidet.

Um so etwas zu realisieren, gibt es in WordPress mehrere Lösungswege. Ich werde in diesem Artikel ein paar Möglichkeiten vorstellen und natürlich erhebe ich keinen Anspruch auf Vollständigkeit.

Die Conditional Tags

WordPress beherrscht eine Reihe von Conditional Tags. Diese sind in der Lage bestimmte Zustände und Bedingungen abzufragen, zum Beispiel “bin ich in einer Kategorie-Übersicht?” (is_category()).

Will man jetzt auf der Startseite einen Inhalt unterbringen, der z. B. in einem Archiv (Monatsarchiv, Kategorie-Übersicht) nicht vorkommen soll, dann könnte man in der index.php vor dem Loop folgendes unterbringen:

<?php if (is_home()) { ?>
    <div class="info-box">...</div>
<?php } ?>

Du könntest dich dem Problem natürlich auch von der anderen Seite nähern. Nehmen wir mal an, du möchtest bei der Ausgabe des Jahres-Archivs eine kleine Abweichung haben, dann einfach folgenden Code vor dem Loop unterbringen.

<?php if (is_year()) { ?>
    <div class="info-box">...</div>
<?php } ?>

Bei der Abfrage der Startseite bitte auch folgenden Artikel beachten: WordPress: bin ich auf der Startseite?

Verschiedene Template-Dateien

Um sich nicht in den diversen Conditional Tags zu verheddern hat man auch die Möglichkeit, für verschiedene Zustände einer Website auch entsprechende Template-Dateien zu erstellen.

Neben dem Haupttemplate (index.php) kann man noch die page.php für Seiten, single.php für die Ansicht eines einzelnen Artikels, category.php für das Kategorie-Archiv etc. erstellen. Das geht so weit, dass man auch für einzelne Kategorien extra Templatedateien erstellen kann: category-wordpress.php wäre zuständig für die Kategorie mit dem Namen “WordPress”. Weitere Infos dazu gibt es in der offiziellen Dokumentation.

[adrotate group=”6″]

Plugins

Neben den mittlerweile 9.100 Plugins im offiziellen Verzeichnis, existieren auch mehrere Erweiterungen, deren Aufgabe es ist Kategorien bzw. Artikel bestimmter Kategorien von der Startseite ausblenden. Die Suche nach “exclude categories” (dt. Kategorien ausschließen) liefert mir 176 Ergebnisse, wobei nicht alle Plugins in das Ergebnis passen.

Wie sehr oft bei WordPress ist auch hier die Qual nicht ob es eine Lösung für etwas gibt, sondern welche der vielen Lösungen die richtige ist. Wer aus dieser Liste einen Plugin empfehlen kann immer her damit.

Sauereien im Loop

Man kann aber bei der Lösung der Fragestellung auch selber die Hand anlegen und den Loop manipulieren.

Hier eine konkrete Anforderung aus der Praxis. Bei einem Auftrag sollten auf der Startseite je drei Artikel aus drei verschiedenen Kategorien in separaten Blöcken aufgelistet werden. So schaut dann die Lösung aus, die ich eingesetzt habe:

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php if (in_category('1') && is_home()) continue; ?>
<?php if (in_category('2') && is_home()) continue; ?>
<?php if (in_category('3') && is_home()) continue; ?>
<?php endwhile; ?>
<?php else : ?>
<p>Es existieren keine Einräge zu diesem Thema.</p>
<?php endif; ?>

<h3>News</h3>

<?php query_posts('cat=1&showposts=3');
$posts = get_posts('category=1&numberposts=3&offset=0');
foreach ($posts as $post) : start_wp(); ?>
    <div class="auszug">...</div>
<?php endforeach; ?>

<h3>Pressemitteilungen</h3>

<?php query_posts('cat=2&showposts=3');
$posts = get_posts('category=2&numberposts=3&offset=0');
foreach ($posts as $post) : start_wp(); ?>
    <div class="auszug">...</div>
<?php endforeach; ?>

<h3>Veranstaltungen</h3>

<?php query_posts('cat=3&showposts=3');
$posts = get_posts('category=3&numberposts=3&offset=0');
foreach ($posts as $post) : start_wp(); ?>
    <div class="auszug">...</div>
<?php endforeach; ?>

Damit das ganze übersichtlich bleibt, habe ich das Code-Beispiel auf das nötigste reduziert.

In dem ersten Abschnitt fängt der Loop wie gewohnt an: if ( have_posts() ) : while ( have_posts() ) : the_post();. Aber schon in der zweiten Zeile gibt es Abweichung. Mit in_category() fragt man ob sich ein bestimmter Artikel in einer Kategorie befindet, wenn ja, dann wird die Ausführung des Codes fortgesetzt.

In Zusammenspiel mit den Template-Tags query_posts und get_posts() holt man sich dann je drei Artikel aus der entsprechenden Kategorie. Selbstverständlich muss man die Kategorie-IDs noch anpassen. 🙂

Ich habe die Lösung an meine Bedürfnisse angepasst, aber wo ich den originalen Code gefunden habe kann ich beim besten Willen nicht mehr nachvollziehen.

Wir arbeiten seit 20 Jahren mit WordPress und bieten diverse Dienst­leistungen rund um das System an. Kontaktiere uns für weitere Informationen oder für ein Angebot.

Verwandte Beiträge:

13 Kommentare

  1. Da geht noch mehr zu reduzieren:

    if in_category( array( 1,2,3 ) ) && is_home()) continue;

    Wobei ich das mit dem continue und wp_start bisher nicht kenne? Sollte aber trotzdem gehen oder?

  2. Mich überrascht eigentlich, dass das nicht viel häufiger eingesetzt wird. Prinzipiell kann man ein WordPress Template aus nur einer Datei (plus einer für die Kommentare und natürlich eine für CSS 🙂 basteln.

    Der Code wird zwar weniger übersichtlich, aber Änderungen muss man nicht mehr an einer Handvoll Dateien vornehmen.

  3. @Michael Prinzipiell geb ich Dir recht, aber ich denke das geht nur bis zu einer gewissen größe der Website. Desweiteren hat man ja einige Abfragen schon im Core von WP und ich denke die sollte man dann auch nutzen. Gemeinsame Sachen, kann man in eigene Funktionen auslagern, so muss man diese auch nur an einer Stelle ändern. Ein guter Mitelweg ist in meinen Augen das beste. Zuviele IF Abfragen sind denke ich kontraproduktiv. Es sei den man arbeiten dann mit defines oder dergleichen.

  4. Liese sich das mit den “jeweils 3 Artikel aus einer Kategorie” auch mit Schlagwörtern machen und wenn ja, wie würde dann der Code aussehen?

    Bin da grad verzweifelt am suchen 🙁

    Viele Grüße, André

  5. Hallo,

    diese Lösung gefällt mir sehr gut. Ich bin leider nicht fit genug in wordpress. Deshalb muss ich wissen, was ich im template hier (…) eingeben muss:

    Im Moment besteht mein Ergebnis im Frontend aus den Überschriften und danach 3 Zeilen mit “…” (logisch …) Habe schon mit dem Loop herumgemurkst, aber ich frage lieber den Fachmann.

    Willst/Darfs Du das verraten?

    Grüße
    Sabine

  6. Nochmal ich,

    ich habe eben herausgefunden, dass ich zumindest dies hier eingeben muss.

    Insofern hat sich meine letzte Frage erledigt.

    Aber es gibt eine neue Frage:
    Wie kann ich dafür sorgen, dass der Auszug nicht in voller Länge, sondern eben als Auszug (“Weiterlesen….”) angezeigt wird. Das funkt bei mir nicht, obwohl ich in den Beiträgen den more-tag gesetzt habe.

    Danke und Grüße
    Sabine

    PS: Falls Du Dich wunderst, dass ich die Code-Tags nicht benutzt habe: In der live-Vorschau bleibt die Anzeige zwischen den Code-Tags bei mir leer, sobald ich etwas lösche und ändere.

  7. Hallo Sabine,

    der Auszug wird durch the_excerpt(); realisiert und dieser erlaubt keine Formatierungen, es wird nur purer Text ausgegeben. Möchtest du den Excerpt (Auszug) erweitern in dem du die Auslassungszeichen ([…]) ersetzt, dann hilft dir dieser Link weiter.

  8. Vielen Dank für den Link.

    Das war nicht genau das, was ich suchte.
    Aber ich hab es dafür hier gefunden …

    Vielleicht hiflt das dem einen oder anderen weiter.

    Grüße
    Sabine

  9. Hallo Perun, danke für den ausführlichen Artikel. Leider hat es bei mir mit dem Anpassen der Inhalte auf der Startseite unter WordPress 3.x so nicht auf anhiebt funktioniert. Ich habe nun als Interimslösung das Plugin “Frontpage Manager” scharf geschaltet – funktioniert soweit einwandfrei. Am Wochenende dann aber noch mal versuchen die Loop direkt anzupassen. Bin kein Freund von zu vielen Plugins 😉

  10. Ich bräuchte mal ein Plugin das nur ausgewählte Artikel auf die Startseite lässt. Und erst ab der zweiten Seite die “normalen”. Jemand eine Idee?

  11. Ich schließe mich azellas Frage an – kann man das evtl. über einen tag lösen? Ich bin mit “has_tag” leider noch nicht weitergekommen, das liegt aber wohl nur an meinen beschränkten php-Kenntnissen.

Kommentare sind geschlossen.