web-dev-qa-db-ja.com

x日より古い特定の投稿タイプの投稿を自動削除するcronジョブ

60日以上経過している特定の投稿タイプ(この場合は "vfb_entry")の投稿をすべて削除します。クーロン・ジョブは1日1回実行する必要があります。

次のようなコードがありますが、cronジョブを起動しても機能しません。ただし、phpMyAdminでクエリのみを実行しても正しい結果が返されます。だから機能自体に問題があるに違いない。

誰でも手伝ってもらえますか?

// Cron Job to Delete VFB Entries older than 60 days
if(!wp_next_scheduled( 'remove_old_vfb_entries')){
    wp_schedule_event(time(), 'daily', 'remove_old_vfb_entries');
}
add_action('remove_old_vfb_entries', 'myd_remove_old_vfb_entries');

// Build the function
function myd_remove_old_vfb_entries(){
global $wpdb;
// Set max post date and post_type name
$date = date("Y-m-d H:i:s", strtotime('-60 days'));
$post_type = 'vfb_entry';

// Build the query 
// Only select VFB Entries from LFG or LFM Form
$query = "
    SELECT $wpdb->posts.ID FROM $wpdb->posts 
    WHERE post_type = '$post_type' 
    AND post_status = 'publish' 
    AND post_date < '$date'
    AND ($wpdb->posts.ID IN (SELECT entry_id FROM wp_postmeta_lfg4 WHERE post_id IS NOT NULL) OR $wpdb->posts.ID IN (SELECT entry_id FROM wp_postmeta_lfm3 WHERE post_id IS NOT NULL))
    ORDER BY post_modified DESC
";
$results = $wpdb->get_results($query);
            foreach($results as $post){
                // Let the WordPress API clean up the entire post trails
                wp_delete_post( $post->ID, true);
          }
}

編集:wp_postsとwp_postmetaと以下のINNER JOINを使うだけで、私の意見を問い合わせることなく解決できます。

1
jackennils
// add the schedule event if it has been removed 
if( ! wp_next_scheduled( 'mg_remove_old_entries' ) ) {
  wp_schedule_event( time(), 'daily', 'mg_remove_old_entries' ); //run the event daily
}

// action hooked to fired with wordpress cron job
add_action( 'mg_remove_old_entries', 'mg_remove_old_entries' );
function mg_remove_old_entries() {
  $posts = get_posts( [
    'numberposts' => -1,
    'post_type' => 'vfb_entry',
    'date_query' => [
      // get all the posts from the database which are older than 60 days
      'before' => date( "Y-m-d H:i:s", strtotime( '-60 days' ) ),
    ],
  ]);

  if( !empty($posts) ) {
    foreach( $posts as $post ) {
      wp_delete_post( $post->ID ); //remove the post from the database
    }
  }
}

注:カスタムSQLクエリを実行する必要はありません。それは質問を遅くするでしょうそしてまたそれはwordpressのためによくありません。 Wordpressにはすでにすべての機能が組み込まれています。

// Cron Job to Delete VFB Entries older than 60 days
if(!wp_next_scheduled( 'remove_old_vfb_entries')){
    wp_schedule_event(time(), 'daily', 'remove_old_vfb_entries');
}
add_action('remove_old_vfb_entries', 'myd_remove_old_vfb_entries');

// Build the function
function myd_remove_old_vfb_entries(){
global $wpdb;
// Set max post date and post_type name
$date = date("Y-m-d H:i:s", strtotime('-60 days'));
$post_type = 'vfb_entry';

// Build the query 
// Only Delete Entries from Form 5 and 8
$query = "
    SELECT $wpdb->posts.ID FROM $wpdb->posts 
    INNER JOIN $wpdb->postmeta 
      ON $wpdb->posts.ID = $wpdb->postmeta.post_id 
    WHERE post_type = '$post_type' 
    AND post_status = 'publish' 
    AND $wpdb->postmeta.meta_key = '_vfb_form_id' 
    AND ($wpdb->postmeta.meta_value = 5 OR $wpdb->postmeta.meta_value = 8) 
    AND post_date < '$date' 
";
$results = $wpdb->get_results($query);
            foreach($results as $post){
                // Let the WordPress API clean up the entire post trails
                wp_delete_post( $post->ID, true);
          }
}
1
jackennils

60日以上経過している特定の投稿タイプ(この場合は "vfb_entry")の投稿をすべて削除します。クーロン・ジョブは1日1回実行する必要があります。

最初のステップはcronジョブを設定することです。問題のコードはこの部分に対して正しいので、基本的には以下のようになります。

2番目の部分では、エントリが60日を超えている特定の投稿の種類についてデータベースを照会する必要があります。これをget_posts()で行い、post_type引数とdate_query引数を指定することができます。

//* If the scheduled event got removed from the cron schedule, re-add it
if( ! wp_next_scheduled( 'wpse_213720_remove_old_entries' ) ) {
  wp_schedule_event( time(), 'daily', 'wpse_213720_remove_old_entries' );
}

//* Add action to hook fired by cron event
add_action( 'wpse_213720_remove_old_entries', 'wpse_213720_remove_old_entries' );
function wpse_213720_remove_old_entries() {
  //* Get all the custom post type entries older than 60 days...
  $posts = get_posts( [
    'numberposts' => -1,
    'post_type' => 'wpse_262471_post_type',
    'date_query' => [
      'before' => date( "Y-m-d H:i:s", strtotime( '-60 days' ) ),
    ],
  ]);
  //* ...and delete them
  array_filter( function( $post ) {
    wp_delete_post( $post->ID );
  }, $posts );
}

上記の答えは直接$wpdbを問い合わせます。 get_posts()抽象化の使用は、読みやすさや将来性の保証など、さまざまな理由で優れています。

0
Nathan Johnson