如何从我的服务器删除除当前在帖子中使用的图像之外的所有生成的图像

时间:2014-02-26 作者:Will

我有一套新的图片大小,用于我网站的开发主题。我的服务器充满了旧的图像大小,其中大多数从未使用过。你以前听过这个,对吗?

The Question
如何从我的服务器中删除所有WP生成的缩略图,但不删除帖子中当前使用的缩略图?

也就是说:$ find . -name "*-*x*.jpg" | xargs rm -f 锤子太宽,因为myimage-300x250.jpg 可能用在帖子中。尽管如此,它的其他6个变体还是欢迎您放弃!

我想我需要生成一个已使用图像的列表,将其与我的目录进行比较,然后删除差异(减去原始图像)。但我不知道该怎么办。


The“why?“侧边栏:
服务器上额外的图像大小通常没什么大不了的,但我们现在有超过2.7个Gig,把它们留下来备份似乎是一种浪费。此外,我们即将开始新的工作-为什么不进行春季大扫除呢?

至于拇指的再生,虽然新设计有了新的图像规格,但我们没有人有时间去用RTE插入的图像更新数百篇旧帖子。我说,过去的就让它过去吧。

1 个回复
最合适的回答,由SO网友:TheDeadMedic 整理而成

这应该让您开始:

循环所有帖子并构建链接图像文件数组;交叉检查其中是否有链接到,可能需要对其进行批处理或提高超时时间;内存限制,取决于服务器;您正在处理的帖子数。

$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\'在您的帖子内容中动态显示。

结束

相关推荐

Removing blog page images

我有我的blog page here 然而,在我创建的一个网站上,我不太明白在哪里可以找到代码来去除我孩子主题上的图像。我使用的是2010年的代码,我已经设置了自己的博客模板页面,但它不起作用,所以我显然编辑了错误的文件。所以不是循环。php我想要编辑的文件,以便在主博客页面上删除这些图像?<?php /* How to display all other posts. */ ?> <?php else : ?> <div i