Post auf Entwurf nach festgelegtem Zeitraum basierend auf post_modified date setzen

Ich habe einen benutzerdefinierten Beitragstyp für die Benutzerprofilseite. Mein Kunde möchte, dass alle Nutzer ihr Profil mindestens einmal im Monat aktualisieren. Daher möchten wir, dass ihr Profil (benutzerdefinierter Beitrag) nach 30 Tagen automatisch auf Entwurf gesetzt wird. Sie erhalten dann eine E-Mail mit der Aufforderung, den Beitrag zu aktualisieren. Der Beitrag muss 30 Tage nach dem letzten Änderungsdatum erneut entworfen werden und eine weitere Erinnerung gesendet werden usw.

Bisher habe ich diesen Code, um die Beiträge nach 30 Tagen des Veröffentlichungsdatums zu verfallen, was nicht zu funktionieren scheint. Ich vermute, dass mir etwas in Bezug auf die Cron-Planung fehlt:

if ( ! wp_next_scheduled( 'run_post_expiration' ) ) { wp_schedule_event( time(), 'hourly', 'run_post_expiration' ); } add_action( 'run_post_expiration', 'expire_posts' ); function expire_posts() { global $wpdb; $daystogo = "30"; $sql = "UPDATE wp_posts SET `post_status` = 'draft' WHERE `post_type` = 'profile' AND DATEDIFF(NOW(), `the_date`) > '$daystogo')"; $wpdb->query($sql); } add_action('init', 'expire_posts'); 

Ich habe diesen Code, um das post_date auf das post_modified date zu setzen, also den obigen Code immer noch alle 30 Tage funktionieren zu lassen:

 function reset_post_date_wpse_121565($data,$postarr) { $data['post_date'] = $data['post_modified']; $data['post_date_gmt'] = $data['post_modified_gmt']; global $post; if ($post->post_type == 'profile'){ return $data; } } add_filter('wp_insert_post_data','reset_post_date_wpse_121565',99,2); 

Der obige Code, um das post_date zu modifizieren, funktioniert tatsächlich, aber es verursacht auch einige Probleme mit anderen Post-Typen, die ich nicht erwartet habe, also denke ich, dass irgendwo ein Fehler sein könnte.

Kann mir jemand helfen, damit das funktioniert? Oder gehe ich das überhaupt richtig an? Vielleicht gibt es eine bessere Lösung. Ich habe das Plugin “Post Expirator” ausprobiert, aber das funktioniert nur mit post_date; Sobald jemand sein Profil einmal aktualisiert hat, funktioniert es nicht mehr.

BEARBEITEN:

Ich habe den ursprünglichen Code bearbeitet, um die Posts auf Draft zu setzen (basierend auf Code, den ich woanders gefunden habe):

 add_action( 'my_trash_hook', 'my_trash_hook_function' ); if (!wp_next_scheduled('my_trash_hook')) { wp_schedule_event( time(), 'hourly', 'my_trash_hook' ); } function my_trash_hook_function() { global $wpdb; $daystogo = "1"; $sql = "UPDATE {$wpdb->posts} SET 'post_status' = 'draft' WHERE 'post_type' = 'tests' AND DATEDIFF(NOW(), 'the_date') > '$daystogo')"; $wpdb->query($sql); } 

Ich habe eine andere function eingerichtet, um mir eine E-Mail zu senden, wenn der Beitrag auf Entwurf festgelegt ist, und eine andere, mir eine E-Mail zu senden, wenn der Beitrag erneut veröffentlicht wird.

Was passiert, wenn ich mich bei der Seite anmelde, wird mir eine E-Mail geschickt, die sagt, dass der Beitrag veröffentlicht wurde, aber keiner sagt, dass der Beitrag auf Entwurf gesetzt wurde. Nicht sicher, ob die beiden Teile des Codes miteinander in Konflikt stehen oder einfach falsch sind.

Solutions Collecting From Web of "Post auf Entwurf nach festgelegtem Zeitraum basierend auf post_modified date setzen"

Benutze keinen global $post . Alles, was Sie brauchen, sollte in die function in den Parametern $data und $postarr werden.

Zweitens müssen Sie die $data in allen Fällen zurückgeben. Was Sie jetzt tun, ist effektiv Löschen von Daten für alles außer Ihrem profile Beitragstyp.

Sie müssen ein bisschen reorganisieren:

 function reset_post_date_wpse_121565($data,$postarr) { if ($data['post_type'] == 'profile'){ $data['post_date'] = $data['post_modified']; $data['post_date_gmt'] = $data['post_modified_gmt']; } return $data; } add_filter('wp_insert_post_data','reset_post_date_wpse_121565',99,2); 

Ich habe das nicht gründlich getestet, aber das ist die richtige Idee.

Wie für einen besseren Weg …

Ihre function expire_posts wird nicht zuverlässig portierbar sein, da sie ein fest codiertes databasepräfix verwendet. Zumindest schreiben Sie das SQL so um, dass das Präfix nicht fest codiert ist:

 function expire_posts() { global $wpdb; $daystogo = "30"; $sql = "UPDATE {$wpdb->posts} SET `post_status` = 'draft' WHERE `post_type` = 'profile' AND DATEDIFF(NOW(), `post_date`) > '$daystogo')"; $wpdb->query($sql); } add_action('init', 'expire_posts'); 

Ich merke auch, dass Ihre WHERE Klausel eine Spalte hat, die nicht existiert. Es gibt keine the_date Spalte in der $wpdb->posts Tabelle . Es sollte post_date .

Ehrlich gesagt, wenn Sie nur mit dem modifizierten Datum arbeiten, sollten Sie in der Lage sein, dies zu erreichen, ohne jemals das Datum des Posts zu ändern. Ich glaube nicht, dass Sie diesen zweiten Block Code überhaupt brauchen.