Как удалить все созданные изображения с моего сервера, кроме тех, которые в настоящее время используются в публикациях


У меня есть новый набор размеров изображений для темы моего сайта в разработке. Мой сервер заполнен старыми размерами изображений, большинство из которых никогда не использовались. Вы слышали это раньше, верно?

Вопрос
Как удалить все созданные WP миниатюры с моего сервера , но не те миниатюры, которые в настоящее время используются в публикациях ?

То есть что-то вроде: $ find . -name "*-*x*.jpg" | xargs rm -f слишком широк для молотка, потому что myimage-300x250.jpg может использоваться в сообщении. Его 6 других тем не менее, вариации приветствуются, чтобы уйти!

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


Боковая панель " почему?":
Дополнительные размеры изображений на сервере, как правило, не имеют большого значения, но сейчас у нас более 2,7 гигабайт, и просто кажется пустой тратой оставлять их и создавать резервные копии. Кроме того, мы собираемся начать все сначала - почему бы не сделать это весной уборка?

Что касается регенерации больших пальцев, в то время как новый дизайн имеет новые спецификации изображений, ни у кого из нас нет времени, чтобы обновить сотни старых постов с вставленными изображениями RTE. Пусть прошлое останется в прошлом, говорю я.

Author: Will, 2014-02-26

1 answers

Это должно помочь вам начать:

  1. Просмотрите все сообщения и создайте массив связанных файлов изображений
  2. Просмотрите все вложения изображений и перепроверьте, были ли какие-либо из них связаны с

Возможно, потребуется выполнить пакетную обработку или увеличить время ожидания и лимит памяти, в зависимости от сервера и количества записей, с которыми вы работаете.

$posts = get_posts(
    array(
        'posts_per_page' => -1,
        'post_type' => array( 'post', 'page' ),
    )
);

$files = array();
foreach ( $posts as $post ) {
    if ( preg_match_all( '/src=(?:\'|")(.+?)(?:\'|")/', $post->post_content, $matches ) ) {
        foreach ( $matches[1] as $url ) {
            // Replace "wp-content/uploads/" with your upload directory if not default setup
            if ( preg_match( '!wp-content/uploads/(.+)$!', $url, $matches_2 ) )
                $files[] = $matches_2[1];
        }
    }
}

$posts = get_posts(
    array(
        'posts_per_page' => -1,
        'post_mime_type' => 'image',
        'post_type' => 'attachment',
        'fields' => 'ids',
    )
);

update_postmeta_cache( $posts );

foreach ( $posts as $post_id ) {
    if ( is_file( $file = get_attached_file( $post_id ) ) ) {
        if ( $meta = wp_get_attachment_metadata( $post_id ) ) {
            $path = dirname( $file );

            if ( preg_match( '!^[0-9]{4}/[0-9]{2}/!', $meta['file'], $matches ) ) {
                // Split date folders with filename for when searching size variations
                $suffix = $matches[0];
            } else {
                $suffix = '';
            }

            if ( ! in_array( $meta['file'], $files ) ) {
                // Original file not in post content
                // unlink( $file ); 
            }

            foreach ( $meta['sizes'] as $name => $data ) {
                if ( ! in_array( $suffix . $data['file'], $files ) ) {
                    // Image size not in post content
                    // unlink( "$path/{$data['file']}" );
                }
            }
        }       
    } else {
        wp_delete_post( $post_id, true ); // Might as well clean up
    }
}

Что вы будете с этим делать, зависит от вас. Если вы собираетесь сохранить оригинал, но удалить изменения размера, убедитесь, что вы стерли его существование из записи базы данных в $meta['sizes'] и сохранить с помощью wp_update_attachment_metadata( $post_id, $meta ).

Вы даже можете зайти так далеко, чтобы восстановить новые размеры с помощью wp_get_image_editor() и обновить старые src в содержимом вашего поста на лету.

 7
Author: TheDeadMedic, 2014-02-27 10:55:20