Bearbeiten Sie die Postkategorie nach der Zeit

Nach dem Lesen einiger Posts über Post-Kategorien-Manipulation mit einer bestimmten Zeit wollte ich ein Plugin erstellen, das Posts nach einem Datum manipulieren würde. Meine ursprüngliche Referenz ist vor sechs Jahren: ” Plugin zum Ändern der Kategorie eines Posts basierend auf dem Post-Datum? “, Aber ich habe mehrere Posts bezüglich Manipulation referenziert:

  • Ich muss alle WordPress-Beiträge zu einem geplanten Zeitpunkt in großen Mengen aktualisieren
  • Wie kann ich Beiträge verbergen, die älter als 2 Jahre sind?

Es wird jedoch nicht die Kategorie entfernt und die neue hinzugefügt:

Code:

function check_if_cat_has_reached_time() { // test if term exists and if doesn't return $test_term1 = term_exists('Uncategorized', 'category'); if ($test_term1 !== 0 && $test_term1 !== null) : // $default_cat = get_term_by('id', 'Uncategorized', 'category'); $default_cat = get_cat_ID('uncategorized'); else : return; endif; // test if term exists and if doesn't return $test_term2 = term_exists('failed', 'category'); if ($test_term2 !== 0 && $test_term2 !== null) : $new_cat = get_cat_ID('failed'); else : return; endif; global $post; // the Post ID $the_ID = $post->ID; // Post creation time in epoch // $post_creation = get_the_time('U',$the_ID); // current time in epoch $current_time = time(); // two years in epoch $two_years = 31556926*2; // post time plus two years $post_plus_two = (int)$two_years + (int)get_the_time('U',$the_ID); if ($current_time >= $post_plus_two && has_category($default_cat,$the_ID)) : wp_remove_object_terms($the_ID, $default_cat, 'category'); $update_post_cat = array( 'post_category' => array($new_cat), ); wp_insert_post($update_post_cat); endif; } add_action('save_post', 'check_if_cat_has_reached_time'); 

Gibt es einen Grund, warum wp_remove_object_terms() nicht funktioniert? Ich habe das nach dem Lesen verwendet, um eine bestimmte Kategorie aus einem Beitrag zu entfernen .

Also meine Fragen sind:

  • Entferne ich die Kategorie korrekt?
  • Aktualisiere ich die Kategorie richtig?
  • Gibt es einen besseren Haken zum Bearbeiten von Posts in einem Plugin?
  • Gäbe es performancesprobleme, wenn dies auf einer Website mit mehreren tausend Posts implementiert wäre?

BEARBEITEN:

Die folgende Antwort habe ich versucht, in der function.php meines Themas zu implementieren, aber es funktioniert immer noch nicht. Ich verwende ein Standardthema mit WP Test . Vor der function stelle ich sicher, dass die Kategorien erstellt werden mit:

 function create_foo_category() { wp_insert_term( 'Foo', 'category', array( 'description' => 'This is the Foo', 'slug' => 'foo' ) ); } add_action('after_setup_theme', 'create_foo_category'); 

dann für bar :

 function create_bar_category() { wp_insert_term( 'Bar', 'category', array( 'description' => 'This is the bar', 'slug' => 'bar' ) ); } add_action('after_setup_theme', 'create_bar_category'); 

Ich habe versucht, die bereitgestellte Antwort zu manipulieren mit:

 function check_if_cat_has_reached_time() { global $post; $the_ID = $post->ID; if (!wp_is_post_revision($the_ID)) { // unhook this function so it doesn't loop infinitely remove_action('save_post', 'check_if_cat_has_reached_time'); // test if term exists and if doesn't return $check_default_cat = term_exists('Foo', 'category'); if ($check_default_cat !== 0 && $check_default_cat !== null) { $default_cat = get_cat_ID('foo'); } else { return; } // test if term exists and if doesn't return $check_new_cat = term_exists('Bar', 'category'); if ($check_new_cat !== 0 && $check_new_cat !== null) { $new_cat = get_cat_ID('bar'); } else { return; } // current time in epoch $current_time = time(); // two years in epoch $two_years = 31556926*2; // post time plus two years $post_plus_two = (int)$two_years + (int)get_the_time('U',$the_ID); if ($current_time >= $post_plus_two && has_category($default_cat,$the_ID)) { wp_remove_object_terms($the_ID, $default_cat, 'category'); $args = array( 'ID' => $the_ID, 'post_category' => array($new_cat), ); wp_update_post($args); } // re-hook this function add_action('save_post', 'check_if_cat_has_reached_time'); } } add_action('publish_post', 'check_if_cat_has_reached_time'); 

BEARBEITEN:

Nachdem ich mit ein paar Leuten gesprochen habe, war es meiner Meinung nach etwas unklar, wozu der beabsichtigte Zweck der oben genannten war. Ich versuche, die Posts zu ändern, ohne sie täglich mit etwas wie einem Event zu betreten. Nachdem ich dieses Problem weiter diskutiert hatte, wurde ich auf wp_schedule_event() , das ich testen und bearbeiten werde.

Solutions Collecting From Web of "Bearbeiten Sie die Postkategorie nach der Zeit"

Ihre aktuelle function funktioniert ziemlich gut, aber sie ist an einen Post-Update-Hook angeschlossen, so dass Sie einen Post bearbeiten / aktualisieren müssen, damit er ausgeführt werden kann. Wenn die Posts nach der angegebenen Zeit automatisch geändert werden sollen, müssen Sie ein geplantes Ereignis einrichten. Ich kann mir zwei Möglichkeiten vorstellen, wie Sie Ihren Zeitplan einrichten können …

1. Ein wiederkehrendes Ereignis, das alle (relevanten) Beiträge überprüft

Wir können wp_schedule_event() , um an einem Hook in bestimmten Intervallen zu laufen:

 // a custom hook to schedule add_action( 'wpse_269529_check_posts', 'wpse_269529_check_posts_cats' ); // make sure the event hasn't been scheduled if( !wp_next_scheduled( 'wpse_269529_check_posts' ) ) { // Schedule the event wp_schedule_event( time(), 'daily', 'wpse_269529_check_posts' ); } 

Die Parameter für wp_schedule_event() sind (in Reihenfolge); wenn das erste Ereignis ausgeführt werden soll (wir können einfach time() , um es von jetzt an auszuführen), wie oft es laufen soll (eines von “stündlich”, “twicedaily” oder “täglich”), und der zu startende Hook. Sie können auch einige Argumente übergeben, aber wir brauchen das nicht.

Wir verwenden auch wp_next_scheduled() , um zu überprüfen, dass das Ereignis nicht bereits geplant wurde.

Dann brauchen wir die function, die auf diesem Haken läuft. Wir können das verwenden, um alle Posts mit der Kategorie, die Sie ersetzen möchten, zu durchlaufen und dann diese mit der neuen Kategorie zu aktualisieren:

 function wpse_269529_check_posts_cats() { //categories $old_cat = get_cat_ID( 'foo' ); $new_cat = get_cat_ID( 'bar' ); // get all posts with the required category $args = array( 'posts_per_page' => -1, 'category' => $old_cat ); $myposts = get_posts( $args ); // loop through all posts and update with new category foreach ( $myposts as $mypost ) { $args = array( 'ID' => $mypost->ID, 'post_category' => array( $new_cat ), ); wp_update_post($args); } } 

Du erwähnst die performance, und das führt eine Schleife durch alle Beiträge mit der Kategorie, also ist es vielleicht nicht die beste Option …

2. Eine einzelne geplante Veranstaltung pro Post

Sie können dies mit wp_schedule_single_event() tun und den Zeitplan bei der Post-Erstellung erstellen (beachten Sie, dass das nur für neue Posts funktioniert und nicht für bestehende Posts). Sie publish_post eine function an publish_post , die den Zeitplan publish_post :

 // runs when a post is published add_action( 'publish_post', 'wpse_269529_schedule_post_check' ); function wpse_269529_schedule_post_check( $post_id ) { // set the time when the event should be scheduled $timestamp = strtotime( '+2 years' ); // Schedule the event wp_schedule_single_event( $timestamp, 'wpse_269529_check_post', array( $post_id ) ); } 

Jetzt, da wir dies an publish_post , können wir die Post-ID an das geplante Ereignis übergeben und den darauf basierenden Beitrag aktualisieren (denken Sie daran, die Anzahl der Parameter im Aktions-Hook auf “1” für unsere ID festzulegen):

 // a custom hook to schedule add_action( 'wpse_269529_check_post', 'wpse_269529_check_post_cats', 10, 1 ); // replace post categories function wpse_269529_check_post_cats( $post_id ) { //categories $old_cat = get_cat_ID( 'foo' ); $new_cat = get_cat_ID( 'bar' ); // check for the old category if ( has_category( $old_cat, $post_id ) ) { // update post with new category $args = array( 'ID' => $post_id, 'post_category' => array( $new_cat ), ); wp_update_post($args); } } 

Sie können eine Kombination der beiden verwenden und alle vorhandenen Posts bei der Aktivierung von Plugins oder Designs durchlaufen (oder etwas anderes, je nachdem wann, warum und wie Sie dies tun) und dann ein Update pro Post für alle neuen Posts planen.

Der save_post Hook übergibt die ID des save_post an seine Callback-function, so dass get_the_ID() nicht benötigt wird.

Wenn Sie wp_insert_post() , wird bei jedem Speichern eines wp_insert_post() ein neuer Post in die database eingefügt. Verwenden wp_update_post() stattdessen wp_update_post() :

 function check_if_cat_has_reached_time($post_id) { if ( ! wp_is_post_revision( $post_id ) ){ // unhook this function so it doesn't loop infinitely remove_action('save_post', 'check_if_cat_has_reached_time'); // test if term exists and if doesn't return $check_default_cat = term_exists('Uncategorized', 'category'); if ($check_default_cat !== 0 && $check_default_cat !== null) { $default_cat = get_cat_ID('uncategorized'); } else { return; } // test if term exists and if doesn't return $check_new_cat = term_exists('failed', 'category'); if ($check_new_cat !== 0 && $check_new_cat !== null) { $new_cat = get_cat_ID('failed'); } else { return; } // post time plus two years $post_plus_two = strtotime('+2 years') + strtotime(get_the_date('YM-d',$post_id)); if (strototime(date('YM-d')) >= $post_plus_two && has_category($default_cat,$post_id)) { wp_remove_object_terms($post_id, $default_cat, 'category'); $args = array( 'ID' => $post_id, 'post_category' => array($new_cat), ); wp_update_post($args); } // re-hook this function add_action('save_post', 'check_if_cat_has_reached_time'); } } add_action('publish_post', 'check_if_cat_has_reached_time'); 

Der Teil remove_action ist wichtig, da wp_update_post save_post jedem wp_update_post save_post hook save_post . Daher ist es möglich, eine Endlosschleife zu erstellen.