1. Herzlich willkommen bei WPDE.org, dem grössten und ältesten deutschsprachigen Community-Forum rund um das Thema WordPress. Du musst angemeldet oder registriert sein, um Beiträge verfassen zu können.
    Information ausblenden

Pagination mit Transient-Cache funktioniert nicht zusammen

Dieses Thema im Forum "Allgemeines" wurde erstellt von Andreas 2012, 11. März 2021.

  1. Andreas 2012

    Andreas 2012 Well-Known Member

    Registriert seit:
    25. November 2012
    Beiträge:
    71
    Zustimmungen:
    0
    Hallo Wordpress-Freunde,

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

    Code:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    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
     
  2. mensmaximus

    mensmaximus Well-Known Member

    Registriert seit:
    24. Juli 2014
    Beiträge:
    8.857
    Zustimmungen:
    437
    $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.
     
  3. Andreas 2012

    Andreas 2012 Well-Known Member

    Registriert seit:
    25. November 2012
    Beiträge:
    71
    Zustimmungen:
    0
    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:

    Code:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    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
     
  4. mensmaximus

    mensmaximus Well-Known Member

    Registriert seit:
    24. Juli 2014
    Beiträge:
    8.857
    Zustimmungen:
    437
    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.

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

    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 ;)
     
    #4 mensmaximus, 12. März 2021
    Zuletzt bearbeitet: 12. März 2021
  5. Andreas 2012

    Andreas 2012 Well-Known Member

    Registriert seit:
    25. November 2012
    Beiträge:
    71
    Zustimmungen:
    0
    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ß ;)
     
  6. mensmaximus

    mensmaximus Well-Known Member

    Registriert seit:
    24. Juli 2014
    Beiträge:
    8.857
    Zustimmungen:
    437
    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.
     
  7. Andreas 2012

    Andreas 2012 Well-Known Member

    Registriert seit:
    25. November 2012
    Beiträge:
    71
    Zustimmungen:
    0
    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...
     
  8. mensmaximus

    mensmaximus Well-Known Member

    Registriert seit:
    24. Juli 2014
    Beiträge:
    8.857
    Zustimmungen:
    437
    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.
     
  9. Andreas 2012

    Andreas 2012 Well-Known Member

    Registriert seit:
    25. November 2012
    Beiträge:
    71
    Zustimmungen:
    0
    Aaaaaa, alles klar. Aber wie lange braucht denn so ein Cronjob für ca. 10.000 Einträge über Nacht, funktioniert das?
     
    #9 Andreas 2012, 12. März 2021
    Zuletzt bearbeitet: 12. März 2021
  10. mensmaximus

    mensmaximus Well-Known Member

    Registriert seit:
    24. Juli 2014
    Beiträge:
    8.857
    Zustimmungen:
    437
    Mach doch mal einen Test ;) phpMyAdmin :)
     
  11. Andreas 2012

    Andreas 2012 Well-Known Member

    Registriert seit:
    25. November 2012
    Beiträge:
    71
    Zustimmungen:
    0
    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?
     
  12. mensmaximus

    mensmaximus Well-Known Member

    Registriert seit:
    24. Juli 2014
    Beiträge:
    8.857
    Zustimmungen:
    437
    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 ;)
     
  13. Andreas 2012

    Andreas 2012 Well-Known Member

    Registriert seit:
    25. November 2012
    Beiträge:
    71
    Zustimmungen:
    0
    Perfekt, so mache ich das :D

    Vielen Dank für die tolle Hilfe und ein schönes Wochenende!
     
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden