Ändern Sie den Poststatus basierend auf dem Metawert

Ich habe diesen Cron eingerichtet, um Post-Posts x Tage nachdem es veröffentlicht wurde. Das funktioniert. Bearbeiten: Meine Antwort zu meiner Frage hinzugefügt.

add_action( 'wp', 'do_trash_ads' ); function do_trash_ads() { if ( ! wp_next_scheduled( 'delete_classifieds' ) ) wp_schedule_event( time(), 'daily', 'delete_classifieds' ); } add_action( 'delete_classifieds', 'expire_posts' ); function expire_posts() { global $wpdb; $daystogo = "14"; $post_ids = $wpdb->get_results( " SELECT ID FROM {$wpdb->posts} WHERE post_type ='classifieds' AND post_status = 'publish' AND DATEDIFF(NOW(), post_date) > '{$daystogo}' " ); foreach( $post_ids as $id ) { $postid = $id->ID; $my_post = array(); $my_post['ID'] = $postid; $my_post['post_status'] = 'trash'; wp_update_post( $my_post ); } } 

Was ich tun möchte : Fügen Sie in der obigen function Beiträge ein, die auf einem Meta-Feldwert basieren (21 Tage ist der Standardwert, aber ein Benutzer kann ein früheres Datum auswählen).

Ich habe dafür einen 2. Cron eingerichtet.

 add_action( 'wp', 'do_trash_ads_user' ); function do_trash_ads_user() { if ( ! wp_next_scheduled( 'delete_ads_user' ) ) wp_schedule_event( time(), 'daily', 'delete_ads_user' ); } add_action( 'delete_ads_user', 'expire_posts_user' ); function expire_posts_user() { global $wpdb; $post_ids = $wpdb->get_results( " SELECT ID FROM {$wpdb->posts} WHERE post_type ='classifieds' AND post_status ='publish' " ); foreach( $post_ids as $id ) { $postid = $id->ID; $expiration_value = get_post_meta( $postid, 'ecpt_ad-expire-date', true ); if( $expiration_value ) { $todays_date = date( "Ymd" ); $today = strtotime( $todays_date ); $expiration_date = strtotime( $expiration_value ); if ( $expiration_date > $today ) { } else { $my_post = array(); $my_post['ID'] = $postid; $my_post['post_status'] = 'trash'; wp_update_post( $my_post ); } } } } 

Ich weiß nicht, ob das die beste Methode ist, aber es funktioniert.

Solutions Collecting From Web of "Ändern Sie den Poststatus basierend auf dem Metawert"

Ihr Code sieht gut aus, und da Sie keine vom Benutzer eingegebenen Daten einreichen, ist die Methode prepare () nicht erforderlich. Es ist jedoch eine gute Vorgehensweise, zu lernen, wie sie funktioniert und sie konsistent verwendet.

Mit der prepare () Methode würde der Code folgendermaßen aussehen:

 $sql = $wpdb->prepare( " SELECT ID FROM %s WHERE post_type = 'classifieds' AND post_status = 'publish' ", $wpdb->posts ); $post_ids = $wpdb->get_results( $sql, ARRAY_A ); 

Außerdem könnten Sie Ihre if-statement verkürzen von:

 if ( $expiration_date > $today ) { } else { $my_post = array(); $my_post['ID'] = $postid; $my_post['post_status'] = 'trash'; wp_update_post( $my_post ); } 

zu:

 if ( $expiration_date < $today ) { $my_post = array(); $my_post['ID'] = $postid; $my_post['post_status'] = 'trash'; wp_update_post( $my_post ); }