サポート » 使い方全般 » 投稿とそれに紐づく画像を自動削除する

  • 解決済 webcoffee

    (@webcoffee)


    実装したいのは、「一定期間経過したらカスタム投稿とそれに紐づく画像を自動削除する」というものです。

    紐づく画像の削除はこちらのサイト、一定期間経過したら投稿を自動削除するのはこちらのサイトを参考にさせて頂きました。

    コードは以下の通りです。

    投稿に紐づく画像を削除する処理

    function nxw_delete_post_attachment( $post_id ) {
    	$args = array(
    		'numberposts' => -1,
    		'post_parent' => $post_id,
    		'post_type' => 'attachment',
    		'post_status' => 'any',
    		'post_mime_type' => 'image'
    	);
    	$attachments = get_children( $args );
    	foreach( $attachments as $attachment ) {
    		wp_delete_attachment( $attachment->ID, true );
    	}
    }
    add_action( 'before_delete_post', 'nxw_delete_post_attachment' );

    一定期間経過したら投稿(カスタム投稿タイプ“news”)を自動削除する処理

    function my_auto_delete($pid) {
    	if($parent_id = wp_is_post_revision( $pid )) {
    		$pid = $parent_id;
    	}
    	$timestamp = wp_next_scheduled('my_new_event', array($pid));
    	if($timestamp != false) {
    		wp_clear_scheduled_hook( 'my_new_event', array($pid) );
    	}
    	$time = get_post_time('U', true, $pid);
    	$expire = strtotime('+7 day', $time);
    	wp_schedule_single_event($expire, 'my_new_event', array($pid));
    }
    add_action('save_post','my_auto_delete');
    
    function my_delete_post($pid) {
    	$allposts = get_posts( array('post_type'=> 'news', 'numberposts' => -1));
    	foreach ( $allposts as $eachpost ) {
    		wp_delete_post( $eachpost->ID, true);
    	}
    }
    add_action('my_new_event', 'my_delete_post');

    上記処理をすると、新規で投稿画面に入った瞬間に以前投稿した投稿と画像が全て削除されてしまいます。
    ですので、“投稿に紐づく画像を削除する処理”は問題ないようですが、“一定期間経過したらカスタム投稿を自動削除する処理”の方がうまく動作しません。

    どう修正したら宜しいのでしょうか。

    アドバイス宜しくお願い致します。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • @webcoffee さん

    こんにちは。

    コードを見る限り、以下の箇所が怪しいです。

    $allposts = get_posts( array('post_type'=> 'news', 'numberposts' => -1));

    「newsという投稿を全て取得する」となりますので、一定時間経過したかどうかが考慮されず、全ての記事が削除されてしまいます。

    「投稿日が特定の日付以前の記事」を指定するパラメータとして、date_query があります。
    未検証ですが、以下のようになると思います。

    $args = array(
      'post_type'      => 'news',
      'posts_per_page' => -1,
      // 2015年1月1日以前の記事を取得する
      'date_query'     => array(
        array(
          before'    => array(
            'year'  => 2015,
            'month' => 1,
            'day'   => 1,
          ),
          'inclusive' => true,
        ),
      ),
    );
    
    $allposts = get_posts( $args );

    参考:https://developer.wordpress.org/reference/classes/wp_query/
    date_query でページ内検索してみて下さい。

    ただ実際は、現在日を基準に過去〇日以前に投稿された記事を対象としないといけないので、上記コードのカスタマイズが必要です。

    もしご自身でのプログラミングが難しい場合は、似た機能を持ったプラグインを探す方がよいかもしれません。

    スレッド開始 webcoffee

    (@webcoffee)

    @wildworks さん

    ご回答ありがとうございます。

    なかなか返信が出来ずすみません。

    「現在日を基準に過去〇日以前に投稿された記事」を指定するために$borderを設定し、beforeに入れ込んだら出来ました。(下記コードでは7日を指定)

    
    $border = wp_date( strtotime('-7 day') );
    $args = array(
    	'post_type'      => 'news',
    	'posts_per_page' => -1,
    	'date_query'     => array(
    		array(
    			'before'    => $border,
    			'inclusive' => true,
    		),
    	),
    );
    $allposts = get_posts( $args );
    

    あとは、最初の投稿でmy_auto_delete関数を設定しsave_postフックにかけていましたが、記事の保存によらず定期的に動作させたいので、wp_schedule_eventを使って処理しようと思います。

    とても助かりました。

    ご回答どうもありがとうございました!

    スレッド開始 webcoffee

    (@webcoffee)

    補足

    wp_dateはフォーマット(必須)を指定しないと動作しません。

    正しくは

    $border = wp_date( 'Y-m-d',strtotime('-2 day') );
    

    です。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • このトピックに返信するにはログインが必要です。