Как удалить все созданные изображения с моего сервера, кроме тех, которые в настоящее время используются в публикациях
У меня есть новый набор размеров изображений для темы моего сайта в разработке. Мой сервер заполнен старыми размерами изображений, большинство из которых никогда не использовались. Вы слышали это раньше, верно?
Вопрос
Как удалить все созданные WP миниатюры с моего сервера , но не те миниатюры, которые в настоящее время используются в публикациях ?
То есть что-то вроде: $ find . -name "*-*x*.jpg" | xargs rm -f
слишком широк для молотка, потому что myimage-300x250.jpg
может использоваться в сообщении. Его 6 других тем не менее, вариации приветствуются, чтобы уйти!
Я думаю, что мне нужно создать список использованных изображений, сравнить его с моим каталогом и удалить разницу (за вычетом оригиналов). Но как это сделать, ускользает от меня.
Боковая панель " почему?":
Дополнительные размеры изображений на сервере, как правило, не имеют большого значения, но сейчас у нас более 2,7 гигабайт, и просто кажется пустой тратой оставлять их и создавать резервные копии. Кроме того, мы собираемся начать все сначала - почему бы не сделать это весной уборка?
Что касается регенерации больших пальцев, в то время как новый дизайн имеет новые спецификации изображений, ни у кого из нас нет времени, чтобы обновить сотни старых постов с вставленными изображениями RTE. Пусть прошлое останется в прошлом, говорю я.
1 answers
Это должно помочь вам начать:
- Просмотрите все сообщения и создайте массив связанных файлов изображений
- Просмотрите все вложения изображений и перепроверьте, были ли какие-либо из них связаны с
Возможно, потребуется выполнить пакетную обработку или увеличить время ожидания и лимит памяти, в зависимости от сервера и количества записей, с которыми вы работаете.
$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
в содержимом вашего поста на лету.