Автоматическое удаление вложений, которые старше х дней

Есть ли способ автоматического удаления вложений, которые старше х дней? потому что время от времени я получаю более 10 миллионов изображений, и база данных растет настолько велика, что замедляет работу сайта из-за ограниченного процессора

Solutions Collecting From Web of "Автоматическое удаление вложений, которые старше х дней"

Вы действительно уверены, что хотите это сделать? Как насчет всех сообщений, в которых используются эти «старые» вложения? Для вложений, которые используются для таких вещей, как «признак изображения», WP возьмет это для вас. Однако для использования приложения в post_content, например

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

вы получите «сломанные» ссылки.

Но, если вы действительно уверены, вы можете сделать это с помощью WP-Cron .

Быстрое и грязное решение, которое, вероятно, не делает все, что вам нужно для этого, будет выглядеть примерно так ( примечание : я действительно не тестировал этот код, потому что, очевидно, я не хочу удалять старые вложениях на любом сайте, который я сейчас поддерживаю):

  // 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, когда вам это больше не нужно. Я оставлю это как «упражнение для читателя», чтобы выяснить, как это сделать (подскажите, см. « Распределение задач» для получения дополнительной информации).