web-dev-qa-db-fra.com

Supprimer automatiquement les pièces jointes antérieures à x jours

Existe-t-il une méthode pour supprimer automatiquement les pièces jointes plus anciennes que x jours? parce que de temps en temps, je finis par avoir plus de 10 millions d’images et la base de données grandit tellement qu’elle ralentit le site en raison de la capacité limitée

1
TravelWhere

Êtes-vous vraiment sûr de vouloir faire cela? Qu'en est-il de tous les messages dans lesquels ces "anciennes" pièces jointes sont utilisées? Pour les pièces jointes utilisées pour des éléments tels que "image sélectionnée", WP en prendra pour vous. Toutefois, pour les utilisations d’une pièce jointe dans post_content, par exemple,.

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

vous allez vous retrouver avec des liens "cassés".

Mais, si vous êtes vraiment sûr, vous pouvez le faire en utilisant WP-Cron .

Une solution rapide et sale, qui ne fait probablement pas tout ce dont vous auriez besoin , ressemblerait à quelque chose comme ( note : Je n'ai pas testé ce code car, évidemment, I ne souhaite pas supprimer les anciennes pièces jointes des sites que je gère actuellement):

    // 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 () ;
    }

Assurez-vous de ne pas planifier le travail cron lorsque/si vous n'en avez plus besoin. Je laisserai cela comme un "exercice pour le lecteur" pour comprendre comment faire cela (indice, voir Annuler les tâches pour plus d'informations).