web-dev-qa-db-ja.com

X日より古い添付ファイルを自動削除する

X日より古い添付ファイルを自動削除する方法はありますか?時々原因を変えると私は1000万以上の画像とデータベースを持っていることになってしまいます。

1
TravelWhere

あなたは本当に本当にこれをやりたいのですか?これらの「古い」添付ファイルが使用されているすべての投稿についてはどうですか。 "おすすめの画像"などに使用される添付ファイルの場合、WPがその代わりになります。ただし、post_contentで添付ファイルを使用する場合は、.

<img src='img_attachment_url' />
<a href='pdf_attachment_url'>download PDF</a>

あなたは「壊れた」リンクになってしまうでしょう。

しかし、あなたが本当に確信しているなら、 WP-Cron を使ってそれを行うことができます。

everythingあなたがそれをする必要があるとは思わない、迅速で汚い解決策は、( note のようになります。明らかに、I私が現在維持しているどのサイトでも古い添付ファイルを削除したくないからです。

    // using this $num_days global is a kind of a hack but it makes sure that
    // all of the places where we need X we have the same value
    // if you were to encapsulate this code into a class
    // then you could set it as a class const
    global $num_days ;
    $num_days = 10 ;

    // hook into cron_scedules to add our "every X days"
    add_filter ('cron_schedules', 'add_my_schedule') ;
    // add our cron hook
    add_action ('my_cron_hook', 'my_cron_func') ;

    // if our hook is not currently scheduled, then schedule it
    if (!wp_next_scheduled ('my_cron_hook')) {
        wp_schedule_event (time (), "$num_days_days", 'my_cron_hook') ;
    }

    /**
     * add our "every X days" to the available schedules
     */
    function
    add_my_schedule ($schedules)
    {
        global $num_days ;

        $schedules["$num_days_days"] = array (
            'interval' => $num_days * DAY_IN_SECONDS,
            'display'  => esc_html__("Every $num_days Days"),
            ) ;

        return ($schedules) ;
    }

    /**
     * this is the func that will be called when the cron job executes
     */
    function
    my_cron_func ()
    {
        global $num_days, $post ;

        // query for attachments added more than $num_days ago
        $args = array (
            'post_type' => 'attachment',
            'post_status' => 'inherit',
            'date_query' => array (
                // see https://codex.wordpress.org/Class_Reference/WP_Query#Date_Parameters
                // for more info on this 'before' date_query syntax
                'before' => "$num_days days ago",
                ),
            'posts_per_page' => -1,
            ) ;
        $old_attachments = new WP_Query ($args) ;

        while ($old_attachments->have_posts ()) {
            $old_attachments->the_post () ;

            wp_delete_attachment ($post->ID, true) ;
            }

        // probably not necessary to call wp_reset_postdata(),
        // since we're in a cron job, but doesn't hurt
        wp_reset_postdata () ;
    }

必要でなくなった場合は、必ず/ cronジョブのスケジュールを解除してください。その方法を理解するために、私はそれを「読者のための演習」として残しておきます(ヒント、詳細については 未確定タスク を参照)。