web-dev-qa-db-fra.com

Comment supprimer toutes les images générées de mon serveur, à l'exception de celles actuellement utilisées dans les publications

J'ai un nouvel ensemble de tailles d'image pour le thème en développement de mon site. Mon serveur est rempli d'anciennes tailles d'images, dont la plupart n'ont jamais été utilisées. Vous avez entendu celui-ci avant, non?

La question
Comment puis-je supprimer toutes les WP miniatures générées de mon serveur mais pas les miniatures actuellement utilisées dans les publications ?

C'est-à-dire que quelque chose comme: $ find . -name "*-*x*.jpg" | xargs rm -f est trop large pour un marteau parce que myimage-300x250.jpg pourrait être utilisé dans une publication. Ses 6 autres variantes sont les bienvenues!

Je pense que j'ai besoin de générer une liste d'images utilisées, de la comparer à mon répertoire et de supprimer la différence (moins les originaux). Mais comment s'y prendre, ça m'échappe.


La barre latérale " pourquoi? ":
Les tailles d’images supplémentaires sur le serveur ne sont généralement pas un gros problème, mais nous avons déjà plus de 2,7 concerts à leur actif et il semble tout simplement inutile de les quitter et de les sauvegarder. De plus, nous sommes sur le point de commencer à nouveau - pourquoi ne pas faire le ménage du printemps?

En ce qui concerne la régénération des pouces, bien que le nouveau design ait de nouvelles spécifications d'image, aucun d'entre nous n'a le temps d'aller mettre à jour des centaines de publications plus anciennes avec des images insérées par RTE. Que le passé soit passé, je dis.

4
Will

Cela devrait vous aider à démarrer:

  1. Boucle sur tous les messages et créer un tableau de fichiers image liés
  2. Boucle sur toutes les images jointes et vérifier si certaines d’entre elles ont été liées

Peut-être avez-vous besoin de le mettre en lot ou d'augmenter le délai d'expiration et la limite de mémoire, en fonction du serveur et du nombre de publications avec lesquelles vous travaillez.

$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
    }
}

Ce que vous faites avec cela dépend de vous. Si vous souhaitez conserver l'original mais supprimer les variations de taille, assurez-vous de supprimer son existence de l'entrée de base de données dans $meta['sizes'] et enregistrez-le avec wp_update_attachment_metadata( $post_id, $meta ).

Vous pouvez même aller jusqu'à régénérer les nouvelles tailles avec wp_get_image_editor() & mettre à jour les anciennes src dans votre contenu de publication à la volée.

7
TheDeadMedic