Support » Allgemeine Fragen » Beitrage und Kategorien: Hauptseite und verschiedene Unterseiten

  • Gelöst bxaobh

    (@bxaobh)


    Hallo Leute,

    Hintergrund
    Ich möchte eine nicht ganz so kleine Seite von Contao nach WordPress umziehen.

    Herausforderung

    • Auf der Hauptseite sollen nur Beiträge einer bestimmten Kategorie angezeigt werden.
    • Beiträge anderer Kategorien sollen wiederum (nur) auf verschiedenen, bestimmten Unterseiten angezeigt werden.

    Im Prinzip geht es darum, die Startseite nicht zuzumüllen. Dort kommen wichtige Ankündigungen und so weiter hin. Auf die Unterseiten kommen zum Beispiel Spielberichte einer bestimmten Abteilung.

    Frage

    Wie komme ich das ganze langfristig stabil hin?
    Ich habe Ansätze¹ gefunden, möchte aber nach dem „aktuell bestem“ Weg fragen.

    Danke für alle Hinweise! 🙂

    [¹] Front Page Categories für die Startseite. Permalink Plugin mit verweis auf URL …/category/<bla/ zum Beispiel.

Ansicht von 15 Antworten - 1 bis 15 (von insgesamt 19)
  • Um auf der Startseite nur Beiträge der Kategorie „Hobbits“ ausgeben zu lassen, kannst du in der functions.php eines Child Themes oder im Plugin Code Snippets folgendes Snippet hinzufügen:

    function my_front_page( $query ) {
        if ( $query->is_home() && $query->is_main_query() ) {
            $query->set( 'category_name' => 'hobbits' );
        }
    }
    add_action( 'pre_get_posts', 'my_front_page' );

    Für die Darstellung weiterer Kategorien auf Folgeseiten kannst du ein eigenes Menü erstellen und dort die Kategorie als Menü-Einträge hinzufügen. Mit Aufruf dieser Seiten wird dann ein Kategorie-Archiv mit Beiträgen ausschließlich dieser Kategorie angezeigt.

    Wenn du hingegen eine individuell zusammengesetzte Startseite haben möchtest, müsstest du in einem Child Theme ein Template front-page.php erstellen, in dem du die gewünschten Inhalte gezielt abrufst.

    Darf ich die Frage/Antwort aufgreifen, ich möchte ähnliches machen – das heißt, auf meiner index.php nur die posts der Kategorie id=1 laden (Kategorie-Name heißt bei mir: Startseite).
    front-page gibts bei mir aber nicht. Habe ansonsten alle relevanten Dateien in einem child-theme.
    Auf der index-Seite habe ich nur die Abfrage-Schleife (heißt das so?)

    <?php while ( have_posts() ) : the_post(); ?>
    <article id="post-<?php the_ID(); ?>"> 

    undsoweiter.
    Kann ich in diesen Schnipsel was einfügen, was dazu führt, dass nur die posts der Categorie_id=1 auf der Startseite erscheinen?

    Wenn WordPress Inhalt ausgibt, prüft es, um welche Art von Inhalt es geht und ob für diesen Inhaltstyp ein spezielles Template vorhanden ist. Falls nicht, fällt WordPress auf ein Template zurück, dass weniger speziell ist, bis zuletzt die index.php übrig bleibt. Um also z.B. eine Kategorie „Hobbits“ anzuzeigen wird erst nach einem Template category-hobbits.php gesucht, dann nach dem allgemeineren category.php, dann nach archive.php und zuletzt nach index.php. Diese Vorgehensweise wird Template-Hierarchie genannt und es gibt eine hübsche Grafik dazu:

    Template Hierarchie

    Theme-Entwickler können entscheiden, ob sie für bestimmte Inhalte ein Template anbieten. Das Template front-page.php wird nur dann verwendet, wenn eine statische Seite als Startseite angezeigt wird (Einstellungen > Lesen > Startseite zeigt statische Seite). Manchmal entscheiden sich Theme-Entwickler auch dafür, statt dessen in einem allgemeineren Template (index.php) das Conditional Tag is_front_page() zu verwenden. Oft ist es aber auch einfach so, dass der Theme-Entwickler für die Startseite keine Abweichung vorgesehen hat und deshalb weder ein Template front-page.php noch die Verwendung eines Conditional Tag für notwendig erachtet. WordPress fügt dem <body>-Tag für statische Startseiten außerdem auch eine eigene CSS-Klasse .front-page hinzu, die dazu genutzt werden kann, zusätzliche Gestaltungsregeln für die Startseite hinzuzufügen.

    Mit Child Themes sind alle möglichen Anpassungen möglich. Du möchtest, dass die Startseite einen anderen Aufbau hat? Dann kannst du im Child Theme nach Belieben entweder ein Conditional Tag verwenden oder ein eigenes Template front-page.php hinzufügen. WordPress sieht bei Aufruf der statischen Startseite, dass ein passendes Template vorhanden ist und verwendet es entsprechend.

    Möchte ich jetzt auf der Startseite nur Beiträge einer eigenen Beitragsart (Custom Post Type) oder aber Beiträge einer Bestimmten Kategorie (Kategorie „Startseite“) ausgeben, wäre es zunächst naheliegend, in einem Child Theme ein Template front-page.php zu erstellen und in diesem eine Abfrage für Beiträge ausschließlich dieser Kategorie hinzuzufügen. Allerdings liegt hier ein Denkfehler vor, denn WordPress hat den Inhalt längst abgerufen und entscheidet erst anhand des Inhalts, welches Template verwendet werden soll! Diese Abfrage würde ich aber verwerfen und statt dessen eine erneute Abfrage durchführen. – Eine gute Performance sieht anders aus.

    Die Lösung ist, bereits vor der Ausführung der ersten Abfrage WordPress mitzuteilen „ach ja, und wenn du die Startseite abrufst: da möchte ich nur Beiträge der Kategorie ‚Startseite‘ sehen“. Das erreichst du durch den o.g. (aussagekräftig benannten) WordPress-Filter pre_get_posts:

    function my_front_page( $query ) {
        if ( $query->is_front_page() && $query->is_main_query() ) {
            $query->set( 'category_name' => 'startseite' );
        }
    }
    add_action( 'pre_get_posts', 'my_front_page' );

    (Abweichend zu meinem ersten Code-Beispiel weiter oben habe ich jetzt hier die Bedingung is_front_page() verwendet, die dann greift, wenn eine statische Seite als Startseite festgelegt wurde. Wenn du aber ohnehin Beiträge ausgeben möchtest, kannst du unter Einstellungen > Lesen auch festlegen, dass die Startseite Beiträge anzeigt. In dem Fall wäre $query->is_home() wiederum richtig.)

    Der Code gehört natürlich in die functions.php des Child Themes und wird ausgelesen, bevor das Template in Erscheinung tritt. Ob du dann überhaupt noch zusätzlich ein Template front-page.php benötigst, hängt davon ab, ob sich der Aufbau der Startseite von der übrigen Website unterscheidet.

    Übrigens ist meine Erfahrung, dass es recht fehleranfällig ist, den Inhalt der Startseite über eine Kategorie „Startseite“ zu steuern. Anwender vergessen nach einer kurzen Einführung rasch, dass sie neue Beiträge dieser Kategorie zuordnen müssen und beschweren sich dann, die Website wäre kaputt, weil ihr neuer Inhalt nicht wie gewünscht angezeigt wird. Auf weiteren Seiten muss die Kategorie wieder aus der üblichen Abfrage ausgenommen werden (z.B. durch Erweiterung des o.g. Filters), um doppelte Inhalte zu vermeiden. Normale Beiträge und Startseiten-Beiträge sind im Backend auf der Beitragsseite durcheinandergewürfelt (auch wenn hier eine Filtermöglichkeit besteht). Bessere Erfahrungen habe ich mit einer eigenen Beitragsart gemacht, die sich sauberer vom übrigen Inhalt trennen lässt. Für den Anwender ist es deutlich einfacher, wenn er ein eigenen Menü „Startseite“ sieht und dort erfasste Inhalte auch ohne weiteres Zutun (Zuweisung einer Kategorie/eines Tag/eines benutzerdefinierten Felds) an der richtigen Stelle erscheinen.

    Vorab schon mal vielen Dank für die ausführlichen Erläuterungen. Leider erhalte ich nach Einfügen der Funktion eine weiße Seite – auch wenn ich in der zweiten Zeile statt is_front_page is_home einsetze.

    Zur Erläuterung meiner Konfiguration folgendes – liegt da vielleicht der Haken:

    Ich habe 3 Kategorien – darunter „Startseite“, aber (ich erinnere mich nicht mehr genau) es war möglicherweise so, daß ich diese nicht explizit angelegt habe sondern diese sich automatisch eingerichtet hat. Kann das sein? Denn vor „Startseite“ befindet sich auch kein Button zum Löschen wie bei den übrigen zwei Kategorien.

    Entsprechend finde ich auf der Beitrags-Erstellungsseite diese drei Kategorien zur möglichen Zuordnung, und bei den meisten Beiträgen (die ich bislang auf localhost selber verfaßt habe) habe ich zwei Kategorien ausgewählt, unter denen die Beiträge erscheinen sollen, darunter eben „Startseite“.

    Bei dem kleineren Teil aller Beiträge habe ich nur die Kategorie „Startseite“ ausgewählt. Und -hört sich vielleicht paradox an- diese Beiträge sollen nun (aus thematischen Gründen) vom Erscheinen auf der homepage (Startseite) weggefiltert werden und nur unter einem Menü-Link anklickbar sein.

    Also der Zustand ist so: ich habe (hier:) 400 Beiträge, die den Kategorien „Startseite“ und „Liveticker“ zugeordnet sind. Und es gibt 100 Beiträge, die nur der Kategorie „Startseite“ zugeordnet sind. Auf der Kategorien-Seite erscheinen also logischerweise unter „Startseite“ 500 Beiträge.
    (Ob ich diese Kategorie bewußt angelegt habe oder nicht – siehe oben)

    Jetzt will ich die 100 Beiträge nicht automatisch auf der Startseite erscheinen lassen, sondern unter einem Menülink. Bei einem Filter „Startseite“ würden also logischerweise und leider alle 500 Beiträge erscheinen, ich müßte also, um zu meinem Ziel zu kommen, alle Beiträge filtern à la „Startseite minus Liveticker“.

    Kann man seinen Beitrag gar nicht mehr bearbeiten? Finde hier keinen Link…
    Habe nämlich noch einen Zusatz:

    Ich könnte die 100 Beiträge händisch bearbeiten und alle einer neu zu definierenden Kategorie zuordnen, die dann ALS SEITE unter einem Menü-Link erreichbar sind.

    Alle neuen Beiträge erscheinen offenbar, wenn man sie keiner Kategorie zuordnet, automatisch auf der Homepage (Startseite). Das spricht dafür daß sich diese Kategorie automatisch selbst erstellt und ich sie offenbar anschließend als „Startseite“ benannt habe. Kann das sein?

    • Diese Antwort wurde geändert vor 4 Jahre, 4 Monaten von donaldtrump.

    Ich habe mich bei nochmaliger Betrachtung entschlossen, eine neue Kategorie einzurichten und die genannten 100 Beiträge händisch nur dieser Kategorie zuzuordnen, die ich dann per „individuellem Link“ im Menü aufrufen kann. Glaube das ist vernünftig.

    • Diese Antwort wurde geändert vor 4 Jahre, 4 Monaten von donaldtrump.

    Das kann man so machen, … – meinen Hinweis bezüglich Usability hattest du gelesen?

    Übrigens war mir bei der Auszeichnung der Funktion ein weiterer Apostroph rein gerutscht. Vielleicht daher der White Screen of Death? Deshalb solche Änderungen bitte immer mit aktiviertem DEDBUG-Modus (wp-config.php) vornehmen, dann siehst du auch, wo der Fehler liegt.

    Ja gelesen – aber nicht 100%ig verstanden. Du hast geschrieben: „…dass es recht fehleranfällig ist, den Inhalt der Startseite über eine Kategorie „Startseite“ zu steuern.“
    Aber die Kategorie Startseite/homepage wird ja offenbar, wie ich geschrieben habe, automatisch angelegt. Jedenfalls kann ich sie auch nicht löschen.
    Das heißt auch, ein neuer Beitrag wird automatisch dieser Kategorie zugeordnet – wennn ich keine andere Kategorie auswähle. Wenn ich nun einen Beitrag in die Kategorie „Startseite“ einordne oder gar keine Einordnung in eine Kategorie vornehme, erscheint der Artikel auf der Startseite. Diese kann (im Menü) den Namen Startseite erhalten. Ist das schlechte Usability?

    Deshalb verstehe ich Deinen folgenden Satz nicht: „Bessere Erfahrungen habe ich mit einer eigenen Beitragsart gemacht, die sich sauberer vom übrigen Inhalt trennen lässt. Für den Anwender ist es deutlich einfacher, wenn er ein eigenen Menü „Startseite“ sieht und dort erfasste Inhalte auch ohne weiteres Zutun (Zuweisung einer Kategorie/eines Tag/eines benutzerdefinierten Felds) an der richtigen Stelle erscheinen.“

    • Diese Antwort wurde geändert vor 4 Jahre, 4 Monaten von donaldtrump.

    Dann hast du scheinbar „Startseite“ als Standard-Kategorie festgelegt – alles landet dort, wenn du es nicht explizit anders angibst.

    Hast du Erfahrungen mit eigenen Beitragsarten? Wenn du, z.B. mit dem Plugin Custom Post Type UI, eine Beitragsart anlegst, kannst du festlegen, dass dafür ein separates Menü im Backend erscheint. Zusätzlich zu „Beiträgen“ und „Seiten“ hast du dann ein Menü „Starseite“ – meiner Meinung nach eine viel sauberere Lösung.

    Habe mal testweise Post Type UI installiert – da erscheinen dann gleich mal rund 50 setting-Optionen und noch einiges andere. Englisch-sprachige Begriffe bereiten mir keine Schwierigkeiten aber herauszufinden was mit den einzelnen Optionen bezweckt wird ist offensichtlich eine Beschäftigung für lange Winterabende. Und eine rasch angelegte Testseite ist schnell angelegt, Kategorie-Auswahl nicht möglich -soll wohl automatisch auf der Startseite erscheinen (?)- aber dummerweise erscheint sie leider nirgendwo…. weiß der Geier welche Option man dazu anklicken muß…
    Ich laß mich ja gern mal auf was Neues ein aber hier habe ich Zweifel, ob das den Aufwand lohnt…
    Vielleicht habe ich es immer noch nicht verstanden? Ja es gibt ein weiteres Menü im Dashboard – da könnte ich dann -übersichtlicherweise- alle Artikel der Startseite sehen. (?) Aber die kann ich ja auch schon auf der Beitragsseite selektieren… Oder wozu ist Post Type UI gut? (Möchte nicht wissen, wieviele Hilfeseiten es für dieses plugin gibt…. damit man da durchblickt…)

    Nehmen wir mal an, du schaust dir gerne Filme an und möchtest neben Blogbeiträgen auch Filmkritiken schreiben. Vor WordPress 3.0 hat man das gemacht, in dem man den Beiträgen unterschiedliche Kategorien zugewiesen hat. Mit Custom Post Types kannst du aber neben Seiten (Impressum, „über mich“) und Beiträgen („neulich gab’s im Kino kein Popcorn …“) auch eine weitere Inhaltsart einfügen (Filme: „Der Weiße Hai“). Im Backend wird dazu ein weiterer Menüeintrag hinzugefügt, der die Inhalte klar voneinander abgrenzt (macht die Sache benutzerfreundlicher).

    Richtig ist, dass Custom Post Types zunächst nirgendwo erscheinen. WordPress-Themes sind so aufgesetzt, dass sie Seiten und Beiträge ausgeben. Custom Post Types werden zunächst nur als Archiv ausgegeben. Wenn du möchtest, dass sie an anderen Stellen auftauchen, musst du eine neue Abfrage hinzufügen oder per Hook pre_get_posts die Abfragen schon im Vorfeld manipulieren.

    Die zahlreichen Einstellungsmöglichkeiten beziehen sich einerseits auf diverse Beschriftungen (z.B. damit im Menü auch wirklich „Neuen Startseitenbeitrag hinzufügen“ oder „Neuen Film hinzufügen“ steht), andererseits bieten sie volle Flexibilität bei der Nutzung: Soll eine neue Inhaltsart im Frontend überhaupt ausgegeben werden? Soll es Archivseiten geben? Soll die Inhaltsart Beitragsbilder enthalten? Welche Berechtigung ist zum Bearbeiten möglich?

    Am einfachsten ist es, wenn du dich langsam herantastest, in dem du erst einmal nur wenige Parameter füllst.

    jetzt pre_get_posts in die Funktions-Datei kopiert, kommt weißer Bildschirm, im DEBUG-Modus erhalte ich bei Aufruf der Homepage:
    syntax error, unexpected ‚=>‘ (T_DOUBLE_ARROW), und zwar in der Zeile $query->set( 'category_name' => 'startseite' );
    Was mach‘ ich da jetzt?

    Über Custom Post Types muß ich nach Deinen weiteren Erläuterungen noch mal meditieren, ob ich das (mit Mehrwert für meine Seite) einsetze. Was man nicht UNBEDINGT benötigt, sollte man vielleicht auch nicht einsetzen… auch unter Berücksichtigung der Performance (noch’n plugin… obwohl ich erst wenige am laufen habe)

    Hm, probier mal
    $query->set( 'category_name', 'startseite' );

    ja danke, „probier mal“ hat funktioniert.
    Dafür habe ich jetzt einen verd…. Salat, wahrscheinlich durch Custom Post Types verursacht. Gestern hatte ich zwei „Test-post types“ angelegt, und die wieder zu löschen funktioniert einfach nicht.
    PROBLEM jetzt:
    Ich habe einen neuen Beitrag in wp geschrieben und der erscheint zwar in der ausgewählten Kategorie, aber auch zusätzlich unerwünscht auf der Startseite. Ich vermute Custom Post Types als Ursache. Habe das plugin entfernt, also deaktiviert und sogar aus dem plugin-Ordner gelöscht, aber das Problem, daß der Beitrag auch auf der Startseite erscheint bleibt. Der Grund warum ich Custom Post Types vermute ist: wenn ich nämlich die Custom Post Types neu installiere (frisch von der .zip-Datei), erscheinen die vorher angelegten Test-post-types wieder! Das plugin hat offenbar irgendwo was hingeschrieben was durch Deaktivieren des plugins nicht verschwindet (meine Laien-hafte Vermutung).

    Und, wie gesagt, das Löschen der Test-post types (entsprechend der Hilfe-Anweisungen) funktioniert nicht. Ich möchte an dieser Stelle die Qualität dieses plugins nicht kommentieren…

    Bleibt mir nur der Weg zu einem gespeicherten backup? Leider hatte ich da einige periphere Änderungen noch nicht gespeichert… die ich dann wiederholen müßte.

    Hm, mit dem Plugin Custom Post Type UI sollte es eigentlich problemlos funktionieren, eine angelegte Inhaltsart wieder zu entfernen. Im Grunde „registrierst“ du die Inhaltsart über das Plugin und fügst anschließend über das neue Menü Beiträge dieser Inhaltsart hinzu. Wird die Inhaltsart gelöscht, bleiben die Inhalte weiter bestehen (werden also nicht automatisch von der Datenbank gelöscht), sie sind dann nur keiner WordPress bekannten Inhaltsart zugewiesen.

    Dass Inhalte anders ausgegeben werden kann zum einen mit der Permalinkstruktur zusammenhängen, die beim Erstellen neuer Inhaltsarten überarbeitet wird. Hier reicht es ggf., wenn du das Menü Einstellungen > Permalinks nach Änderungen nochmal aufrufst, um die Permalinkstruktur zu aktualisieren.

    Zum anderen … könnte es sein, dass du noch einen aktiven pre_get_posts-Filter verwendest, der die Ausgabe beeinflusst?

Ansicht von 15 Antworten - 1 bis 15 (von insgesamt 19)
  • Das Thema „Beitrage und Kategorien: Hauptseite und verschiedene Unterseiten“ ist für neue Antworten geschlossen.