Intereting Posts
пользовательский тип сообщения не отображается в меню Как добавить фильтр только к экземпляру класса? совместное использование wp-include – wp-admin на той же установке порядок запросов mysql Где хранится предпочтение панели администратора пользователя? Я хочу, чтобы он по умолчанию отключился для новых пользователей Линейное редактирование в конце? Как использовать get_template_part вместо include_once? AJAX в WordPress, отправка данных коордов в MySQL и отображение на карте Как создать таблицу базы данных, добавить данные, обновить и удалить с помощью wpdb через плагины? Получать сообщения с одинаковым значением мета как текущее сообщение Удалил бы вручную данные сброса данных «# 1062 – Дублировать запись« 1 »для ошибки« PRIMARY »phpMyAdmin? Экспортировать персонализированные сообщения типа Post со всеми настраиваемыми полями и пользовательской Texonomy, связанной с ним Где вызывается обломок publish_post? Редактирование / удаление дополнительного меню из Divi Проблема Кадрирование изображений из WP Customizer

Автоматически удалять изображения / миниатюры WordPress (все размеры) и отображаться после X дней / часов или аналогичных?

Я ищу решение для автоматического удаления изображений старых сообщений на сайте WordPress. Я хочу сохранить изображения текущих 50 сообщений, другие должны быть удалены автоматически. Это может быть функция для удаления по временному интервалу или функция для хранения только изображений из последних 50 сообщений. Кто-нибудь знает функцию или какой-нибудь плагин, который может делать это или подобные вещи, чтобы автоматически удалять старые изображения? Я считаю, что установка задания cron будет необходима.

Кто-то отправил эту функцию в stackoverflow, но я не вижу никакого упоминания о времени.

function delete_post_media( $post_id ) { $attachments = get_posts( array( 'post_type' => 'attachment', 'posts_per_page' => -1, 'post_status' => 'any', 'post_parent' => $post_id ) ); foreach ( $attachments as $attachment ) { if ( false === wp_delete_attachment( $attachment->ID ) ) { // Log failure to delete attachment. } } } 

Если вам нужно сохранить только изображения для последних 50 сообщений, я не думаю, что работа cron или WP cron – лучшее, что вы можете сделать, в WordPress вы можете знать, когда публикация публикуется, и вы можете запустить обычную каждый раз, когда это происходит, удаляя изображения для сообщения, опубликованного 50 сообщений назад.

Это легко, лучше выполнять (вы ничего не делаете, если вам нечего делать, задание cron работает независимо от того, что вы что-то удаляете или нет).

Рабочий процесс довольно прост:

  1. Каждый раз, когда публикуется сообщение, появляется 51-й почтовый идентификатор (упорядоченный по дате публикации)
  2. удалите все изображения, имеющие этот идентификатор, как почтовый родитель

код:

 add_action( 'save_post', 'cleanup_old_post_images', 10, 3 ); function cleanup_old_post_images( $post_ID, $post, $update ) { if ( $update ) return; // do nothing on update $postid51th = get51th_postid(); // see below if ( ! empty( $postid51th ) && is_numeric( $postid51th ) ) { delete_post_media( $postid51th ); // see below, function in OP } } function get51th_postid() { return $GLOBALS['wpdb']->get_var( "SELECT ID FROM " . $GLOBALS['wpdb']->posts . " WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC LIMIT 50, 1" ); } function delete_post_media( $post_id ) { $attachments = get_posts( array( 'post_type' => 'attachment', 'nopaging' => TRUE, 'post_parent' => $post_id ) ); if ( empty( $attachments ) ) return; // added this line to prevent errors foreach ( $attachments as $attachment ) { if ( false === wp_delete_attachment( $attachment->ID ) ) { // Log failure to delete attachment. } } } 

Это работает для сообщений, опубликованных после того, как вы поместили код на сайт, но вы можете написать функцию run-once для удаления изображений для более старых сообщений

 add_action( 'shutdown', 'delete_older_attachments' ); function delete_older_attachments() { // run only on admin and use a transient to run once if ( ! is_admin() || get_transient('get_older_postids') ) return; // the query to exclude last 50 posts $latest_query = "SELECT ID FROM " . $GLOBALS['wpdb']->posts . " WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC LIMIT 50" ); // get older posts ids $older_ids = $GLOBALS['wpdb']->get_row( "SELECT ID FROM " . $GLOBALS['wpdb']->posts . " WHERE post_type = 'post' AND post_status = 'publish' AND ID NOT IN (" . $latest_query . ")" ); // get attachments for older posts if ( ! empty( $older_ids ) && is_array( $older_ids ) ) { $attachments = $GLOBALS['wpdb']->get_row( "SELECT ID FROM " . $GLOBALS['wpdb']->posts . " WHERE post_type = 'attachments' AND post_parent IN (" . implode( ',', $older_ids ) . ")" ); } if ( isset($attachments) && ! empty( $attachments ) && is_array( $attachments ) ) { foreach ( $attachments as $attachment ) { if ( false === wp_delete_attachment( $attachment ) ) { // Log failure to delete attachment. } } // set the transient to assure run once set_transient( 'get_older_postids', 1 ); } }