web-dev-qa-db-ja.com

現在投稿に使用されているものを除く、生成されたすべての画像をサーバーから削除する方法

私は自分のサイトの開発中のテーマ用に新しい画像サイズのセットを持っています。私のサーバーは古い画像サイズでいっぱいです、それらのほとんどは一度も使われたことがありません。あなたはこれを前に聞いたことがありますね。

質問
すべてのWP生成されたサムネイルを自分のサーバーから削除するにはどうすればよいですか。ただし、現在の投稿で使用されているサムネイルは削除しません

これは、$ find . -name "*-*x*.jpg" | xargs rm -fが投稿で使用される可能性があるため、myimage-300x250.jpgは、幅が広すぎるためです。他にも6種類のバリエーションが用意されています。

私は私が使用した画像のリストを生成し、それを私のディレクトリと比較し、そして(オリジナルを除いた)違いを削除する必要があると思います。しかし、それをどうやって進めるかは私から逃げます。


サイドバー " なぜ? ":
サーバー上の余分な画像サイズは一般的に大したことはありませんが、現在2.7ギグを超える容量があり、それらを残してバックアップするのは無駄に思えます。加えて、我々は新たに始めようとしている - 春の大掃除をしないのはなぜ?

親指を再生成する限り、新しいデザインには新しい画像仕様がありますが、RTEを挿入した画像で何百もの古い投稿を更新して更新する時間はありません。過ぎ去りとしましょう、と私は言います。

4
Will

これであなたは始めるでしょう:

  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
TheDeadMedic