web-dev-qa-db-ja.com

年齢によるメディアライブラリの写真の自動削除

メディアライブラリから3日以上経過した画像を自動削除したい。これを行う方法はありますか?

1
TravelWhere

これらの関数を使用して、作成日から3日経過した添付ファイルを見つけて削除することができます。

// Delete attachments (images) that are {n} days old.
function auto_delete_old_image_atts() {
    // How many days old.
    $days = 3;

    // TRUE = bypasses the trash and force deletion.
    $force_delete = true;

    // Get all attachments that are images.
    $atts = get_posts( array(
        'post_type'        => 'attachment',
        'post_mime_type'   => 'image/%',
        'posts_per_page'   => -1,
        'post_days_old'    => $days,
        'suppress_filters' => false,
    ) );

    $current_date = current_time( 'mysql' );
    foreach ( $atts as $att ) {
        // Get the number of days since the attachment was created.
        $created_datetime = new DateTime( $att->post_date );
        $current_datetime = new DateTime( $current_date );
        $interval = $created_datetime->diff( $current_datetime );

        // If the attachment is $days days old since its CREATION DATE, delete
        // the attachment (post data and image) and all thumbnails.
        if ( $interval->days >= $days ) {
            wp_delete_attachment( $att->ID, $force_delete );
        }
    }
}

// Filter the query so that only posts which are {n} (e.g. 3) days old will be
// returned by MySQL. For this to work, use 'post_days_old' when querying for
// posts using `get_posts()` or `new WP_Query()`.
add_filter( 'posts_clauses', 'filter_posts_by_dates_days', 10, 2 );
function filter_posts_by_dates_days( array $clauses, WP_Query $wp_query ) {
    $days = $wp_query->get( 'post_days_old' );
    if ( is_numeric( $days ) && $days >= 0 ) {
        global $wpdb;
        $clauses['where'] .= $wpdb->prepare( "
            AND ( DATEDIFF( NOW(), {$wpdb->posts}.post_date ) >= %d )
        ", $days );
    }

    return $clauses;
}

最適化の目的で、MySQLが3日前の投稿/添付ファイルのみを選択して返すように、WP_Queryリクエスト/クエリをフィルタリングします。そしてforeachループでは、PHPの組み込みDateTime::diff()関数を使用して、各投稿が実際に3日経過していることを確認します。

自動削除部分では、 wp_schedule_event のように使用できます(詳細はCodexを参照)。

// Schedule an event that runs once in every hour.
add_action( 'init', 'schedule_my_hourly_event' );
function schedule_my_hourly_event() {
    if ( ! wp_next_scheduled( 'my_hourly_event' ) ) {
        wp_schedule_event( time(), 'hourly', 'my_hourly_event' );
    }
}

// Auto-check for old images and delete them, if any.
add_action( 'my_hourly_event', 'auto_delete_old_image_atts' );

あるいは上記のコードを無視して代わりに WP Crontrol を使用してcronイベントを追加することもできます。 (その詳細についてはプラグインのページを見てください)

wp-cron.phpを無効にすることをお勧めします

はい、auto_delete_old_image_atts()長い(そうでない場合非常に長い)時間がかかるため、代わりに "本物の"を使用する必要があります詳細については、 this および this を参照してください。

1
Sally CJ