OK, danke, ich versuche es.
Beiträge von Andreas 2012
-
-
Sorry, das habe ich dann falsch verstanden.
Das heißt, ich muss das ganze nicht in der functions.php abspeichern sondern als Plugin? -
Die Terms werden nicht zugewiesen, d.h. wenn ich die Seite mit dem Alter 55 aufrufe, bleibt sie leer. Wie kann ich denn erkennen, ob der Cronjob läuft?
-
UPDATE:
define( 'WP_DEBUG', true ); ist eingeschaltet, aber es erscheint keinerlei Fehlermeldung, wenn ich die entsprechende Taxonomie aufrufe. Die Seite bleibt ohne Einträge. -
Leider klappt es immer noch nicht. Mein Code sieht jetzt folgendermaßen aus:
Code
Alles anzeigenregister_activation_hook( __FILE__, 'my_activation' ); function my_activation() { $dateStr = '2021-03-15 11:51:00'; $timezone = 'Europa/Berlin'; $timestamp = strtotime($dateStr. ' '. $timezone); if ( ! wp_next_scheduled( 'my_hourly_event' ) ) { wp_schedule_event( $timestamp, 'daily', 'my_hourly_event' ); } } add_action( 'my_hourly_event', 'setze_term', 10, 2 ); function setze_term() { $posts = get_posts( array( 'post_type' => 'person' ) ); $term_id = 55; $taxonomy = "alter"; foreach( $posts as $post ){ $set_terms = wp_set_post_terms( $post->ID, $term_id, $taxonomy, false); if( false === $set_terms || is_wp_error( $set_terms ) ) { } } }Woran könnte es liegen?
-
Ah, super, vielen Dank! Ich werde mich mal daran versuchen ;-)
-
Kannst du mir einen Tipp geben, wie ich das genau machen muss?
-
Hallo mensmaximus,
danke für deine wie immer superschnelle Antwort!30 Einträge hatte ich erst mal eingetragen, um zu sehen, ob das ganze überhaupt funktioniert.
Die taxonomy ist nicht hierarchisch. Und ich hatte mal irgendwo gelesen, dass man wp_set_object_terms zusätzlich nehmen muss, wenn man den Term zuweisen will. Aber dann ist das ja um so besser, wenn es so reicht.Ist denn der Rest mit der cronjob-Funktion soweit in Ordnung? Also bei Abspeichern der functions.php müsste das dann automatisch anlaufen?
-
Hallo Wordpress-Freunde,
ich habe eine Funktion zur Altersberechnung, welche beim Abspeichern eines Custom Post Type automatisch einen Term einer Custom Taxonomy zuordnet. Das funktioniert auch soweit gut. Nun möchte ich aber nachträglich ca. 10.000 bereits existierenden Posts mit wp_schedule_event den Term automatisch zuordnen lassen.
Das folgende Skript, das ich mir für diese Automation zusammengebastelt habe, funktioniert aber leider nicht. Zur Demonstration des Codes habe die eigentliche Funktion, die ich automatisieren möchte, erst mal weggelassen. Es geht wie gesagt erst mal darum, das Abspeichern bzw. Zuordnen der Terms zu automatisieren.
Code
Alles anzeigenfunction run_update_tax_cron_job( ) { $posts = get_posts( [ 'post_type' => 'person', 'posts_per_page' => 30, ] ); foreach( $posts as $post_id ){ // eigentliche Funktion... wp_set_post_terms( $post_id, 'test' ,'alter', false); wp_set_object_terms( $post_id, 'test' ,'alter', false); } } function udpdate_taxonomy_cron_job() { $dateStr = '2021-03-15 09:00:00'; $timezone = 'Europa/Berlin'; $timestamp = strtotime($dateStr. ' '. $timezone); if ( ! wp_next_scheduled( 'run_update_tax_cron_job' ) ) { wp_schedule_event( $timestamp, 'daily', 'run_update_tax_cron_job' ); } } add_action( 'wp', 'udpdate_taxonomy_cron_job' );Hat jemand eine Idee, was an dem Code falsch sein könnte?
Herzlichen Dank für eure Hilfe im voraus!
Andreas
-
Perfekt, so mache ich das :-D
Vielen Dank für die tolle Hilfe und ein schönes Wochenende!
-
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? -
Aaaaaa, alles klar. Aber wie lange braucht denn so ein Cronjob für ca. 10.000 Einträge über Nacht, funktioniert das?
-
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... -
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ß ;-)
-
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:
SQL
Alles anzeigenSELECT ID, post_title, post_name, TIMESTAMPDIFF(YEAR, m1.meta_value, CURDATE()) as alter_jahr, TIMESTAMPDIFF(YEAR, m1.meta_value, m2.meta_value) as alter_jahr2 FROM wp_posts INNER JOIN wp_postmeta m1 ON ( wp_posts.ID = m1.post_id ) INNER JOIN wp_postmeta m2 ON ( wp_posts.ID = m2.post_id ) WHERE wp_posts.post_type = 'person' AND wp_posts.post_status = 'publish' AND m1.meta_key = 'geburtsdatum' AND m2.meta_key = 'todesdatum' HAVING alter_jahr = '$alter' OR alter_jahr2 = '$alter'";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
-
Hallo Wordpress-Freunde,
ich habe eine überlange Liste, die ich in mehrere Seiten splitten möchte. Dazu benutze ich folgenden Code:
Code
Alles anzeigen$items_per_page = 30; $page = isset( $_GET['cpage'] ) ? abs( (int) $_GET['cpage'] ) : 1; $offset = ( $page * $items_per_page ) - $items_per_page; // $results = get_transient('test'.$page); // if ($results === false) { $query = "SELECT ID, post_title, post_name FROM wp_posts WHERE wp_posts.post_type = 'person' AND wp_posts.post_status = 'publish'"; $total_query = "SELECT COUNT(1) FROM (${query}) AS combined_table"; $total = $wpdb->get_var( $total_query ); $results = $wpdb->get_results( $query.' ORDER BY ID DESC LIMIT '. $offset.', '. $items_per_page, OBJECT ); //set_transient('test'.$page, $results, 3600 * 24); //} global $post; foreach( $results as $post ) { the_title( ); } echo paginate_links( array( 'base' => add_query_arg( 'cpage', '%#%' ), 'format' => '', 'prev_text' => __('«'), 'next_text' => __('»'), 'total' => ceil($total / $items_per_page), 'current' => $page ));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
-
Ich vermute mal, dass es mit wp_query keine Lösung für das Problem gibt. Ich werde dann die Abfrage mittels
$wpdb->get_results und meinem selbstgestrickten SQL vornehmen. Oder ist die Performance dann schlechter als mit wp_query? -
Die 55 war natürlich nur ein Beispiel ;)
Ich habe eine variable $alter, die ich aus jedem Dateipfad der einzelnen Alter-Jahreszahlen auslese (.../55-jahre-alt/) und die ich dann im besagten Codeschnipsel einfüge:Das funktioniert, wenn ich als Bezugspunkt den heutigen Tag nehme. Sobald ich bei verstorbenen Personen jedoch den Startpunkt in die Vergangenheit verschiebe, bin ich auf das Feld 'geburtsdatum' UND das Feld 'sterbedatum' angewiesen.
Mit reinem SQL funktioniert das so korrekt:
Code
Alles anzeigen$results = $wpdb->get_results( " SELECT post_title, post_name, TIMESTAMPDIFF(YEAR, m1.meta_value, CURDATE()) as alter_jahr FROM {$wpdb->prefix}posts INNER JOIN {$wpdb->prefix}postmeta m1 ON ( {$wpdb->prefix}posts.ID = m1.post_id ) INNER JOIN {$wpdb->prefix}postmeta m2 ON ( {$wpdb->prefix}posts.ID = m2.post_id ) WHERE {$wpdb->prefix}posts.post_type = 'promi' AND {$wpdb->prefix}posts.post_status = 'publish' AND m1.meta_key = 'geburtsdatum' AND m2.meta_key = 'sterbedatum' HAVING alter_jahr = '48' UNION SELECT post_title, post_name, TIMESTAMPDIFF(YEAR, m1.meta_value, m2.meta_value) as alter_jahr FROM {$wpdb->prefix}posts INNER JOIN {$wpdb->prefix}postmeta m1 ON ( {$wpdb->prefix}posts.ID = m1.post_id ) INNER JOIN {$wpdb->prefix}postmeta m2 ON ( {$wpdb->prefix}posts.ID = m2.post_id ) WHERE {$wpdb->prefix}posts.post_type = 'promi' AND {$wpdb->prefix}posts.post_status = 'publish' AND m1.meta_key = 'geburtsdatum' AND m2.meta_key = 'sterbedatum' HAVING alter_jahr = '48'")Allerdings wollte ich gern auf alle Elemente wie get_permalink() oder get_post_meta($post->ID, 'geburtsort', true) zugreifen und daher die Ausgabe mit wp_query machen:
Mit der Ausgabe über foreach( $results as $result ) konnte ich besagte Elemente nicht abrufen...
-
Enthält das Feld hingegen ein Datum erstellst Du einen alternativen Query.
Genau darum geht es ja. WIE erstelle ich eine Abfrage, wenn ich eine date-range abfragen will, die Werte aus zwei verschiedenen keys benötigt? Hast du da einen Tipp für mich?
-
Ich muss gerade selbst noch mal die Herangehensweise bzw. die Logik überdenken, das ist für mich das eigentlich knifflige.
Bei noch lebenden Personen ist der Bezugspunkt der heutige Tag, da rechnet man anhand der Formel einfach zurück und gibt mittels der date-range $start und $end alle in Frage kommenden Personen aus.
Sobald eine Person im Feld 'sterbedatum' nicht mehr den Wert '0000-00-00' stehen hat, müsste dann der Bezugspunkt der Wert des 'geburtsdatums' zu einem x-beliebigen Punkt in der Vergangenheit sein. Die zeitliche Differenz zu dem Wert aus 'sterbedatum' bildet dann das Alter. Aber diese Range ist ja je nach Person variabel.
Wie kann ich dies trotzdem mit wp_query umsetzen, sodass ich schon on-the-fly sortieren kann, um die entsprechenden Personen auszugeben? Also analog zu der SQL-Variante mit Timestampdiff(YEAR, geburtsdatum, sterbedatum)?
Ich könnte natürlich einfach ALLE Personen der Datenbank abrufen und dann per PHP aussortieren. Aber es handelt sich um fast 10.000 Personen, daher denke ich, ist das nicht der richtige Weg, allein wegen der Performance...