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.
Cela devrait vous aider à démarrer:
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.