Pagination mit Transient-Cache funktioniert nicht zusammen

  • Hallo Wordpress-Freunde,

    ich habe eine überlange Liste, die ich in mehrere Seiten splitten möchte. Dazu benutze ich folgenden Code:

    Dieser Code funktioniert auch einwandfrei, die Seitenpaginierung am Ende der Seiten wird korrekt angezeigt.

    Wenn ich jedoch die Auskommentierung für den Transient-Cache entferne, um den SQL-Code zu cachen, verschwindet die Seitenpaginierung. Die Transienten werden aber korrekt erstellt, d.h. die Variable $page wird auch wie gewünscht übergeben. Also die Namen lauten dann je nach Seite test1, test2, test3 usw. Das habe ich mit dem Plugin "Transienten-Manager" überprüft.

    Woran kann es dann liegen, dass die Seitenpaginierung nicht angezeigt wird?

    Vielen Dank für eure Hilfe im voraus :-)

    Andreas

    • 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

  • $total gibt es nicht, wenn der Transient existiert, da $total innerhalb der if Abfrage definiert wird. Das führt zu einem PHP Fehler bei der Division.

    WordPress ist "frei" wie in Freiheit es zu nutzen, aber nicht im Sinne von Freibier. Wer also glaubt man bekommt rund um WordPress alles kostenlos, der irrt. Hilfe ist ein Geschenk für das man sich bedankt, dafür gibt es den 'Gefällt mir' Button. Wer das nicht kann und sich selbst nicht zu helfen weiss, muss sich bezahlte Unterstützung suchen.

  • Hallo mensmaximus,

    sorry, dass ich mich erst jetzt melde, aber ich hatte auf eine Email-Benachrichtigung gewartet, aber wohl die Benachrichtigungsfunktion nicht aktiviert ;-)

    Vielen Dank für deine Antwort, du hast (mal wieder) meinen Tag gerettet :-D

    Ich habe die Definition von $query, $total_query und $total vor die if-Schleife gesetzt, und jetzt klappt es!
    Jetzt erklärt sich auch die Fehlermeldung, die QueryMonitor mir bzgl. der unbekannten Variable $total ausgegeben hat. Ich bin da partout nicht drüber gefallen.

    Aber bei der Gelegenheit muss ich dich gleich noch mal wegen der Performance des von mir verwendeten SQL-Befehls fragen, denn den Inhalt von $query hatte ich der besseren Übersicht wegen vereinfacht.

    Der originale SELECT-Befehl lautet folgendermaßen:

    Mit dieser query filtere ich über benutzerdefinierte Felder, welche ja in der wp_postmeta liegen, alle Personen aus der Datenbank, die ein bestimmtes Alter haben. Dabei muss ich darauf Rücksicht nehmen, ob die Person noch lebt oder verstorben ist. Die Variable $alter lese ich aus der URL aus.

    Trotz der korrekt gesetzten Transienten wird mir über Query Monitor aber immer noch angezeigt, dass es sich um einen "langsamen Query" handelt. Ich hatte den SELECT-Befehl vorher nicht mit dem Operator "OR" ausgeführt, sondern UNION benutzt, aber da war die Performance noch schlechter.

    Leider lässt sich der aufwendige Code aufgrund der Struktur in der wp_meta-Tabelle, wo es ja nur ein Feld meta_key und meta_value gibt, nicht anders bewerkstelligen, oder?

    Hast du einen Tipp, wie ich die Abfrage trotzdem schneller gestalten könnte?

    Schon mal herzlichen Dank im voraus für deine Meinung!

    Andreas


  • Ich habe die Definition von $query, $total_query und $total vor die if-Schleife gesetzt, und jetzt klappt es!

    Dann kannst Du Dir den Transienten als Cache sparen, denn jetzt führst Du die Datenbankabfrage immer durch, da $total_query ja zählen muss. Wenn Du das Ergebnis $result zwischenspeicherst, kannst Du auch die Anzahl der Datensätze zwischenspeichern. Oder auf die Zählerei verzichten und die Anzahl der array_keys in $result verwenden.


    Trotz der korrekt gesetzten Transienten wird mir über Query Monitor aber immer noch angezeigt, dass es sich um einen "langsamen Query" handelt. Ich hatte den SELECT-Befehl vorher nicht mit dem Operator "OR" ausgeführt, sondern UNION benutzt, aber da war die Performance noch schlechter.

    Ich schätze das liegt unter anderem daran was ich ob gesagt habe. ;)


    Leider lässt sich der aufwendige Code aufgrund der Struktur in der wp_meta-Tabelle, wo es ja nur ein Feld meta_key und meta_value gibt, nicht anders bewerkstelligen, oder?

    Ich kenne die Anwendung nicht. Ich weiß nicht warum das Ganze gemacht wird. Ich kenne die Anzahl der Datensätze nicht. Ich weiß auch nicht wie oft diese Anfragen durchgeführt werden. Ich kenne nur die Anforderung zur Berechnung der Datumsdifferenz. Ich kann Dir daher nur zwei Tipps aus der Praxis gegen:

    1. Lieber zwei einfache Abfragen als eine komplizierte. Konkret: warum die Toten und die Lebenden in einem Query abfragen
    2. Tabellenoptimierung und Indexierung. Konkret: wenn das Alter zu wichtig ist, sollte man es in der Tabelle einfügen und einen Index auf die Spalte legen. Das ist kaum Aufwand beim Speichern und die Abfragen werden deutlich schneller.

    ps: vergiss mal Punkt 2. Du arbeitest ja mit einem Custom Post Type und nicht mit eigenen Tabellen. Also einfach das Alter zu m Zeitpunkt des Todes als Postmeta speichern. Dann kannst Du auch wieder mit einer Meta Query arbeiten ;-)

    WordPress ist "frei" wie in Freiheit es zu nutzen, aber nicht im Sinne von Freibier. Wer also glaubt man bekommt rund um WordPress alles kostenlos, der irrt. Hilfe ist ein Geschenk für das man sich bedankt, dafür gibt es den 'Gefällt mir' Button. Wer das nicht kann und sich selbst nicht zu helfen weiss, muss sich bezahlte Unterstützung suchen.

    4 Mal editiert, zuletzt von mensmaximus (12. März 2021 um 09:00)

  • Danke nochmals :-)

    Ja, du hast recht, es ist wohl das sinnvollste, bei verstorbenen Personen das Todesdatum gleich mit in die Tabelle zu schreiben, dann braucht man das einfach nur abzurufen.

    Aber wo genau müsste ich denn die Variable $total eingefügen, damit kein Error erzeugt wird, wenn es schon einen Transienten gibt?

    Und wie könnte man alternativ auf $total verzichten? Ich hatte aus dem paginate_links mal spaßeshalber die Zeile für total rausgeschmissen, dann verschwindet die Pagination aber wieder. Da bräuchte ich noch mal einen Denkanstoß ;-)

  • Wie ich schon sagte, ich kenne die Anwendung nicht. In Deinem Code muss die Abfrage der Anzahl an Datensätzen innerhlab des des IF Statement erfolgen. Dieses Ergebnis muss dann ebenfalls im Transient gespeichert werden. Schlau ist das aber so nicht, weil für jeden Transient alles wieder neu gezählt wird. Vergiss die eigene Abfrage, vergiss den Transienten. Füge das Alter als Meta hinzu und arbeite mit WP Boardmitteln, dann kümmert sich WordPress um den Rest.

    WordPress ist "frei" wie in Freiheit es zu nutzen, aber nicht im Sinne von Freibier. Wer also glaubt man bekommt rund um WordPress alles kostenlos, der irrt. Hilfe ist ein Geschenk für das man sich bedankt, dafür gibt es den 'Gefällt mir' Button. Wer das nicht kann und sich selbst nicht zu helfen weiss, muss sich bezahlte Unterstützung suchen.

  • Also kurz zum Hintergrund, hatte ich eben vergessen: habe eine Datenbank mit ca. 10.000 Personen-Einträgen und filtere für jedes Alter (z.B. 50) mit o.g. Code die entsprechenden Personen raus, sodass ich eine Liste bekomme mit Personen, die z.B. aktuell 50 Jahre sind oder aber im Alter von 50 Jahren verstorben sind. Das Alter für die Verstorbenen kann ich natürlich fest in der Tabelle speichern, für die Lebenden aber nicht, da das Alter zum aktuellen Zeitpunkt ja erst berechnet wird. So muss ich wenigstens für die lebenden Personen die SQL-Abfrage machen.
    Der Transienten-Cache hat schon etwas an Geschwindigkeit gebracht, daher würde ich das eigentlich gern verwenden. Es sei denn, es gibt eine andere Möglichkeit der Performance-Verbesserung...

  • ayiiiiiiiiiiiiiiii. Du kannst das Alter immer speichern. Und dann erstellst Du einen Cronjob der täglich läuft und das Geburtsdatum der Lebenden prüft. Hat jemand Geburtstag machst Du ein Update des Alters und schickst Ihm einen Geburtstagsgruß. Denk nicht so kompliziert. Oberster Grundsatz, keine eigenen SQL Abfragen wenn es nicht sein muss.

    WordPress ist "frei" wie in Freiheit es zu nutzen, aber nicht im Sinne von Freibier. Wer also glaubt man bekommt rund um WordPress alles kostenlos, der irrt. Hilfe ist ein Geschenk für das man sich bedankt, dafür gibt es den 'Gefällt mir' Button. Wer das nicht kann und sich selbst nicht zu helfen weiss, muss sich bezahlte Unterstützung suchen.

  • Mach doch mal einen Test ;-) phpMyAdmin :-)

    WordPress ist "frei" wie in Freiheit es zu nutzen, aber nicht im Sinne von Freibier. Wer also glaubt man bekommt rund um WordPress alles kostenlos, der irrt. Hilfe ist ein Geschenk für das man sich bedankt, dafür gibt es den 'Gefällt mir' Button. Wer das nicht kann und sich selbst nicht zu helfen weiss, muss sich bezahlte Unterstützung suchen.

  • Wäre es nicht noch eine Steigerung der Nutzerfreundlichkeit, wenn ich das Alter direkt als Taxonomy Term abspeichere? So könnte ich die Abfrage noch einfacher und vor allem mit besserer Performance gestalten.
    Meinst du, es würde gehen, dass man so einen Taxonomy Term per Cronjob aktualisieren kann?

  • Klar geht das wp_set_post_terms(). Und die notwendige Abfrage für die Geburtstagskinder kannst Du ja leicht aus Deinem ersten Versuch mit den Metaqueries ableiten. Das hatte für die Lebenden ja schon funktioniert und ging doch relativ schnell ;-)

    WordPress ist "frei" wie in Freiheit es zu nutzen, aber nicht im Sinne von Freibier. Wer also glaubt man bekommt rund um WordPress alles kostenlos, der irrt. Hilfe ist ein Geschenk für das man sich bedankt, dafür gibt es den 'Gefällt mir' Button. Wer das nicht kann und sich selbst nicht zu helfen weiss, muss sich bezahlte Unterstützung suchen.

Jetzt mitmachen!

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