Intereting Posts
Как получить идентификатор тега posts_nav_link вытягивает несколько типов сообщений Изменение сообщения «Активированный плагин» Как я могу добавить кнопку рядом с кнопкой «редактировать изображение» в «Детали приложения», Как отправлять сообщения на основе геолокации пользователей В настройках >> Общие. Мне не хватает некоторых полей. Ссылки на действия в классе, расположенные в подкаталоге плагина сортировать типы сообщений по количеству просмотров Список сообщений по их пользовательскому термину таксономии с условием С Visual Composer, как Strech только 1 столбец? do_shortcode не работает на некоторых страницах Сообщения CPT в раскрывающемся списке в мета-окне на странице не возвращают идентификатор сообщения Условное: если пользовательский пост текущего автора имеет миниатюру сообщения Ошибки проверки обновления блока Улучшение запросов wpdb с большими данными

Автоматически удалять изображения / миниатюры 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. } } } 

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

Если вам нужно сохранить только изображения для последних 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 ); } }