Block Loop ändern mit Hook ‚'pre_get_posts‘

  • meine Webseite ist noch nicht online wg. des Problems s.u. Aktuell läuft WordPress 6.7.1 mit twenty-twenty-five child-Theme auf lokal Windows 10 mit IIS.

    Ich habe in einem Beitrags-Template in einer Gruppe Titel und Content des KopfBeitrags stehen.

    In einem Block Abfrage-loop darunter werden alle Beiträge passend zum Kopf aufgeführt.

    Diese Loop will ich variabel verändern – nach viel googeln und Supportforen sollte es eigentlich so funktionieren:

    In der functions.php meines Child-Themes habe ich den Code eingefügt, welcher nur für ‚post_per_page‘ funktioniert .


    Was mache ich falsch? Grüße aus Augsburg

    • Anzeige

    Hallo!

    Wenn du gerade an deiner Website arbeitest oder dein aktuelles Hosting überdenkst: Wir betreiben mit NetzLiving eine Hosting-Plattform, die speziell auf Performance, Sicherheit und einfache Verwaltung ausgelegt ist.

    • ✔️ Schnelle Ladezeiten (optimiert für WordPress & Co.)
    • ✔️ Deutsche Server & DSGVO-konform
    • ✔️ Persönlicher Support (kein 0815-Ticket-System)

    Mehr erfahren

  • Hallo b3317133,

    Vielen Dank für die Hinweise :-) :
    $query->set( 'category_name', 'kfz' ); // slug ist kleingeschrieben -> keine Ergebniszeilen
    $query->set( 'cat', 21 ); // Text-Zeichen weg -> kene Ergebniszeilen

    Ich habe es dann versucht mit:
    [INDENT]$query = new WP_Query( array( 'cat' => 21 ) ); //wie in deinem Link angegeben[/INDENT]
    oder
    [INDENT]$query = new WP_Query( array( 'category_name' => 'kfz' ) );[/INDENT]

    dabei kommt immer die Fehlermeldung:
    [INDENT]PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 262144 bytes) in C:\inetpub\wwwroot\wordpress\wp-includes\class-wp-query.php on line 3852[/INDENT]
    -> Speicher habe ich genug..?

    Und ja: meine Beiträge haben mehrere Kategorien und Schlagwörter

  • Der im Link angegebene Code ist nicht für das Einfügen in [FONT=Courier New]pre_get_posts[/FONT] sondern für eigene [FONT=Courier New]WP_Query[/FONT] Abfragen. Der Link dient nur für das Nachlesen der genauen Parameter Syntax und deren Beschreibung.

    Du hast mit Deinem einfachen Copy&Paste der [FONT=Courier New]WP_Query[/FONT] Beispiele eine endlos sich selbst aufrufende Verschachtelung der [FONT=Courier New]pre_get_posts[/FONT] Action bewirkt, die endlos Speicher braucht...

    Versuche es mal mit einem Beitrag mit nur einer Kategorie und/oder schau Dir [FONT=Courier New]category__in[/FONT] an.

  • So, viel Probiererei später:
    meine Beiträge erhalten wahlweise die Hauptkategorien xkopf, xkapitel, xargument
    Dazu erhalten alle zusammengehörigen Beiträge ein gemeinsames Schlagwort "##meinSchlagwort".
    Dann habe ich in meinem Child-theme ein template erstellt, welches einen Single Beitrag (xkopf oder xkapitel) anzeigt und darunter in einem Abfrage-loop ohne Bedingung alle Beiträge aufführt.

    In dem child-theme Ordner habe ich in die functions.php folgenden Code eingesetzt:

    Das funktioniert auch tatsächlich: z.B. zu einem Beitrag der Kategorie "xkopf" werden darunter alle xKapitel-Beiträge aufgelistet - jeweils zu einem gemeinsamen Schlagwort "##meinSchlagwort".
    Allerdings wird die in dem child-Template eingerichtete Header-Navigation (Menü) nicht mehr angezeigt.
    Soweit ich mich eingelesen habe, ist ein Loop eine Grundfunktion und wird bei allen Auflistungen verwendet.
    -> wahrscheinlich verändert mein Code auch die Loop-Bedingung für das Menü.
    Was muss ich tun, damit meine Funktion wirklich nur in dem Template-Blockelement "Abfrage-loop" ausgeführt wird?

    Ich freue mich auf eure Vorschläge :-)
    Grüße aus Augsburg, Clemens

  • Der im Link angegebene Code ist nicht für das Einfügen in [FONT=Courier New]pre_get_posts[/FONT] sondern für eigene [FONT=Courier New]WP_Query[/FONT] Abfragen. Der Link dient nur für das Nachlesen der genauen Parameter Syntax und deren Beschreibung.

    Du hast mit Deinem einfachen Copy&Paste der [FONT=Courier New]WP_Query[/FONT] Beispiele eine endlos sich selbst aufrufende Verschachtelung der [FONT=Courier New]pre_get_posts[/FONT] Action bewirkt, die endlos Speicher braucht...

    Versuche es mal mit einem Beitrag mit nur einer Kategorie und/oder schau Dir [FONT=Courier New]category__in[/FONT] an.


    Hallo b3317133,
    deine Antwort hat mir sehr geholfen und mich von einem Irrweg abgebracht :-)

  • Allerdings wird die in dem child-Template eingerichtete Header-Navigation (Menü) nicht mehr angezeigt.
    Soweit ich mich eingelesen habe, ist ein Loop eine Grundfunktion und wird bei allen Auflistungen verwendet.
    -> wahrscheinlich verändert mein Code auch die Loop-Bedingung für das Menü.


    Daher beschränkt man die Änderung in der Regel auf die sog. Main Loop:

    Code
    if ( !is_admin() && $query->is_main_query() ) {


    Siehe auch Dokumentation.

    Wie Du das ggf. auf einzelne Template-Blockelemente "Abfrage-loop" einschänken kannst, weiss ich nicht.

    5 Mal editiert, zuletzt von b3317133 (26. Januar 2025 um 15:21)

  • Ich habe jetzt eine wenig elegante Lösung gefunden:
    - ich setze in dem Abfrage-loop die Anzahl Beiträge auf 99 (beliebige Zahl)
    - und frage in meinem Code (s. oben) die in der $query belegte Anzahl als Bedingung ab:

    Code
    function xt_modify_main_query($query) {
        $t1 = $query->get( 'posts_per_page' );    //lies die in der $Query verwendete "Anzahl Posts" aus
                                            // und verwende sie als Ausführ-Bedingung
        if (!is_admin() && in_the_loop() && ($t1==99 ) ) {    //ohne "in_the_loop()" wird alles mögliche angezeigt

    Ergebnis: es werden nur die gewünschten Beiträge in dem Loop angezeigt
    -> und auch wieder alle Header und Footer Elemente

    Vielen Dank für die Rückmeldungen - sie haben mich auf dem richtigen Weg gebracht :-).

    Grüße aus Augsburg

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!