it-swarm.com.de

Wie lösche ich alle generierten Bilder von meinem Server mit Ausnahme der aktuell in Beiträgen verwendeten

Ich habe einen neuen Satz von Bildgrößen für das Thema meiner Site in der Entwicklung. Mein Server ist mit alten Bildgrößen gefüllt, von denen die meisten noch nie verwendet wurden. Du hast das schon mal gehört, oder?

Die Frage
Wie lösche ich alle WP generierten Thumbnails von meinem Server aber nicht die Thumbnails, die derzeit in Posts verwendet werden ?

Das heißt so etwas wie: $ find . -name "*-*x*.jpg" | xargs rm -f ist zu breit für einen Hammer, weil myimage-300x250.jpg in einem Beitrag verwendet werden kann. Die 6 anderen Variationen sind jedoch willkommen!

Ich denke, ich muss eine Liste der verwendeten Bilder erstellen, diese mit meinem Verzeichnis vergleichen und die Differenz (abzüglich der Originale) löschen. Aber wie das geht, entgeht mir.


Die " warum? " Seitenleiste:
Zusätzliche Bildgrößen auf dem Server sind im Allgemeinen keine große Sache, aber wir haben derzeit über 2,7 Gigs in Arbeit und es scheint nur eine Verschwendung, sie zu belassen und zu sichern. Außerdem fangen wir gleich neu an - warum nicht den Frühjahrsputz machen?

Während das neue Design neue Bildspezifikationen enthält, hat keiner von uns die Zeit, Hunderte älterer Beiträge mit RTE-Bildern zu aktualisieren. Lass Vergangenheit Vergangenheit sein, sage ich.

4
Will

Damit sollten Sie beginnen:

  1. Durchlaufen Sie alle Beiträge und erstellen Sie eine Reihe verknüpfter Bilddateien
  2. Durchlaufen Sie alle Bildanhänge und überprüfen Sie, ob einer von ihnen verknüpft wurde

Je nach Server und Anzahl der Beiträge, mit denen Sie arbeiten, müssen Sie möglicherweise eine Stapelverarbeitung durchführen oder das Timeout- und Speicherlimit erhöhen.

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

Was Sie damit machen, liegt bei Ihnen. Wenn Sie das Original beibehalten, aber Größenänderungen löschen möchten, stellen Sie sicher, dass der Datenbankeintrag in $meta['sizes'] vorhanden ist, und speichern Sie mit wp_update_attachment_metadata( $post_id, $meta ).

Sie könnten sogar so weit gehen, die neuen Größen mit wp_get_image_editor() neu zu generieren und die alten src in Ihrem Beitragsinhalt on-the-fly zu aktualisieren.

7
TheDeadMedic