Löschen Sie Beiträge von einem Beitragstyp automatisch über Cron

Wie kann ich Cron verwenden, um Posts eines bestimmten Post-Typs zu löschen, wenn sie ein bestimmtes Limit erreicht haben, wie zB maximal 50 Posts behalten?

Der Grund ist, dass diese Posts regelmäßig automatisch importiert werden. Daher möchte ich verhindern, dass die database zu groß wird, abgesehen davon, dass die älteren Posts nicht benötigt werden.

Solutions Collecting From Web of "Löschen Sie Beiträge von einem Beitragstyp automatisch über Cron"

Obwohl ich die Motivation zum Abschneiden von Posts nicht verstehe, ist diese Übung für Sie hilfreich, um zu verstehen, wie man cron + WordPress verwendet.

Erstellen Sie eine function zum Abschneiden von Posts

Dies kann für beide Methoden unterhalb von WP-cron oder UNIX cron verwendet werden.

function foobar_truncate_posts(){ global $wpdb; # Set your threshold of max posts and post_type name $threshold = 50; $post_type = 'foobar'; # Query post type $query = " SELECT ID FROM $wpdb->posts WHERE post_type = '$post_type' AND post_status = 'publish' ORDER BY post_modified DESC "; $results = $wpdb->get_results($query); # Check if there are any results if(count($results)){ foreach($result as $post){ $i++; # Skip any posts within our threshold if($i < = $threshold) continue; # Let the WordPress API do the heavy lifting for cleaning up entire post trails $purge = wp_delete_post($post->ID); } } } 

Hier sind die zwei grundlegenden Ansätze zum Planen von Ereignissen in WordPress.

Approach # 1: Verwenden von WP-Cron

Da dies der Weg von WP ist, werden wir zuerst diesen Ansatz betrachten. Bitte beachten Sie, WP Cron ist kein echtes cron und wird oft psuedo-cron genannt. Es ist nicht konsistent, wenn Sie auf einer Site nur wenig Datenverkehr haben, da dieser auf Anfragen an den Server basiert. Wenn keine Anfragen eingehen, wird das geplante Ereignis verspätet ausgeführt.

Planen Sie Ihre Veranstaltung

 if(!wp_next_scheduled( 'foobar_truncate_posts_schedule')){ wp_schedule_event(time(), 'daily', 'foobar_truncate_posts_schedule'); } 

Haken Sie sich in Ihre Zeitplanaktion ein

 add_action('foobar_truncate_posts_schedule', 'foobar_truncate_posts'); 

Wenn Sie feststellen, dass WP-Cron Ihren Zeitplan nicht enthält, veröffentlichen Sie geplante Beiträge usw., können Sie es mit einem UNIX-Cron weiter automatisieren. Hier ist ein großartiger Artikel , der Ihnen zeigt, wie Sie wp-cron.php in bestimmten Intervallen pingen können. Hier ist, was sie empfehlen, wp-cron pünktlich mit einem UNIX-Cron zu halten.

 wget http://www.server.com/wp-cron.php > /dev/null 2>&1 

Approach # 2: Verwenden eines UNIX-Cron

Sie können echte UNIX-Crons mit nativer admin-ajax.php-functionalität verwenden.

Überprüfen Sie cURL auf Ihrem Server

Bei diesem Ansatz wird cURL verwendet, das auf Ihrem Server installiert werden sollte. Wenn nicht und Sie Apache verwenden, sudo apt-get install php5-curl und dann sudo /etc/init.d/apache2 restart .

Erstelle einen AJAX-Haken

Stellen Sie sicher, dass Sie es auf nopriv setzen, da Ihr Server sich nicht mit WP authentifizieren wird.

 add_action('wp_ajax_nopriv_truncate_posts', 'foobar_truncate_posts_cron'); function foobar_truncate_posts_cron(){ # We use the user-agent as a shared key $shared_user_agent = 'FooBar TruncatePostsCron/1.0'; # Block unwanted IP addresses $whitelisted_ips = array( //IPs allowed to run this operation '192.168.1.1', '127.0.0.1' ); # Retrive Request Information $request_user_agent = $_SERVER['HTTP_USER_AGENT']; $request_ip = $_SERVER['REMOTE_ADDR']; # Authenticate if($request_user_agent === $shared_user_agent && in_array($request_ip, $whitelisted_ips)) echo foobar_truncate_posts(); // Reusable function else echo 'Authentication failed for post trucation cron.'; exit; } 

Fügen Sie Ihre Crontab hinzu

Diese Konfiguration wird einmal pro Tag konsistent ausgeführt. -A setzt den shared user agent secret – -o gibt eine Ausgabedatei an, action=truncate_posts ist relativ zu Ihrer Ajax-Hook-Aktion. Überprüfen Sie /user/bin/curl ist ein ordnungsgemäßer Pfad zum Ausführen eines cURL-Befehls. Sie könnten stattdessen nur curl verwenden.

 0 0 * * * /usr/bin/curl -A 'FooBar TruncatePostsCron/1.0' -o ~/truncate_posts.log http://yourdomain.com/wp-admin/admin-ajax.php?action=truncate_posts 

Und stellen Sie sicher, dass Sie register_globals=off in Ihrer php.ini immer ausschalten, um Spoofing jeglicher Art zu verhindern.

Und schlussendlich…

Dies sind die beiden wichtigsten Ansätze für WordPress + Cron (ob wahr oder nicht). Es gibt viele Möglichkeiten, eine Katze mit Ihrem spezifischen Anwendungsfall in foobar_truncate_posts() . Ich bin sicher, dass Sie es von hier aus optimieren können. Hoffe das hilft dir aus!

Am solidesten wäre es, WP-Cron selbst zu verwenden. Aber wenn Sie eine sehr leichte Anforderung haben, können Sie sie als solche belassen und es werden keine Probleme wie Mehrfachbesuche auftreten, die das wp-cron mehrfach und Ereignisse überlagern, die sich nie wiederholen werden.

Sollte sich darauf beziehen Ist es sicher, wp-cron.php zweimal auszuführen, wenn die erste Instanz zu lange dauert?

Es ist klar gesagt dort (eigentlich die Antwort, die mehr Stimmen verdient) hat die Aussage in der dritten Absatz “weil wp-Cron verschiebt und entschachtelt Jobs, wie es geht. Gerade bevor es einen Job ausführt, es außerplanmäßig. Dies verhindert den Job aus zweimal laufen “, gibt es Befürchtungen, dass es eine Race Condition geben könnte, die auftreten könnte, wenn ein schwer gestörter Blog das gleiche Event zweimal kickt.

Jetzt hat das WordPress-Team eine Lösung für dasselbe, nämlich das cron in der wp-config.php zu deaktivieren. Dies deaktiviert Cron nicht, aber deaktiviert das Abfeuern von Cron, wenn ein Besuch stattfindet. Danach kann ein Web-Cron mit wget oder curl eingerichtet werden, aber wenn wir nicht sicher sind, dass die Dienste innerhalb von 30 Sekunden enden, was das Standard-Timeout für ein PHP-Skript ist, sollte das Cron auf dem Server selbst eingerichtet werden der php cli. Ein ausführlicheres Dokument dazu finden Sie unter https://rtcamp.com/tutorials/wordpress/wp-cron-contab/