So löschen Sie alle nicht verwendeten Fotos function

Ich habe das aktuelle Problem: Ich betreibe eine WordPress-Website mit Woo Commerce und alle paar Tage aktualisiere ich die Produktliste und lösche und importiere über 8000 Produkte gleichzeitig.

Jetzt, jedes Mal, wenn ich +/- 3500 Produkte aus der database lösche, muss ich die Fotos und die Thumbnails für jeden entfernen .. so muss ich mehr als 12.000 Fotos löschen.

Die Verwendung eines beliebigen Plugins ist keine Option, alle frieren ein / hören auf zu arbeiten, also muss ich meine eigene / function oder Plugin erstellen und ich brauche einen Startpunkt.

Ich habe eine Liste mit den alten Produkten und lösche sie wie folgt:

foreach($old_product_list as $oldproduct){ $wpdb->show_errors(); $delq = $wpdb->get_results( " DELETE a,b,c FROM wp_posts a LEFT JOIN wp_term_relationships b ON ( a.ID = b.object_id ) LEFT JOIN wp_postmeta c ON ( a.ID = c.post_id ) LEFT JOIN wp_term_taxonomy d ON ( d.term_taxonomy_id = b.term_taxonomy_id ) LEFT JOIN wp_terms e ON ( e.term_id = d.term_id ) WHERE a.post_title='".$mysqli->real_escape_string($oldproduct['name'])."' " ); 

[…..]

Solutions Collecting From Web of "So löschen Sie alle nicht verwendeten Fotos function"

In der Regel schlage ich vor, dass Sie beim Ändern der database so viel wie möglich an die WordPress-corefunktionen halten, da sie die zugehörigen Daten automatisch verarbeiten – z. B. assoziiertes Post-Meta, zugehörige Taxonomie-Informationen usw. löschen (Woocommerce speichert Produktbilddaten) Produkt post_meta, siehe unten für Details.) Dies kann Dinge im Vergleich zum direkten Zugriff auf die database verlangsamen, aber die database wird dadurch viel sauberer.

Unnötig zu sagen, sichern Sie Ihre database, bevor Sie dies versuchen …

Zuerst müssen Sie mit Post-IDs arbeiten.

 global $wpdb; foreach ($old_product_list as $old_product) { $prod_names[] = $mysqli->real_escape_string($oldproduct['name']); } $prod_ids = $wpdb->get_results($wpdb->prepare(" SELECT ID FROM {$wpdb->prefix}posts WHERE post_type='product' AND post_title IN (%s)", explode(',',$prod_names))); 

Nun gibt es drei verschiedene Dinge, die Sie löschen möchten, in aufsteigender Reihenfolge der “Destruktivität”:

  1. Löschen Sie die Verweise auf Bild-IDs in den Produkten post_meta
  2. Löschen Sie die “Attachment” -Posts, die jedem Bild zugeordnet sind. Dadurch werden die Bilder aus der WordPress-Mediengalerie entfernt
  3. Löschen Sie die tatsächlichen Bilddateien vom Server

Punkt 1 . Dieser ist einfach. Aber um es richtig zu machen , müssen Sie WordPress-functionen verwenden, wie der Code-Kommentar hoffentlich deutlich macht.

 foreach ($prod_ids as $id) { // This will also remove all post_meta associated to the product // and apply any delete_post filters added by Woocommerce or other plugins // Second arg forces deletion, bypassing the trash wp_delete_post($id,true); } 

Punkte 2 und 3, einfacher Fall.

Wenn Ihre Bilder für jedes Produkt eindeutig sind und nicht von irgendwo verlinkt sind, ist ihr post_parent die Produkt-ID, daher können Sie diese Version von https://wordpress.stackexchange.com/a/109803/40965 verwenden , um den Papierkorb zu umgehen :

 function delete_product_attachments($id) { if ('product' !== get_post_type($id)) return; $media = get_children(array( 'post_parent' => $id, 'post_type' => 'attachment' )); foreach ($media as $img) { unlink(get_attached_file($img->ID)); //delete files from server wp_delete_attachment($img->ID,true); //force post deletion, bypassing trash } } add_action('before_delete_post','delete_product_attachments'); 

Die letzte Zeile stellt sicher, dass diese function immer dann aufgerufen wird, wenn wp_delete_post aufgerufen wird, sodass Sie die Lösung nicht zu Punkt 1 oben ändern müssen.

Punkte 2 und 3, allgemeiner Fall. Wenn einige Bilder unter Produkten geteilt werden (von denen einige möglicherweise nicht im aktuellen Stapel gelöscht werden) oder von anderen Posts verlinkt sind, wird die obige Lösung die Dinge stören.

Hier müssen wir verstehen, wie Woocommerce Produktbilder verarbeitet. Die mit einem Produkt verknüpften Bilder werden als post_meta ‘_thumbnail_id’ und ‘_product_image_gallery’ für die Post-ID des Produkts gespeichert. _thumbnail_id ist die post_id des Bildes (post mit post_type = ‘attachment’); _product_image_gallery ist eine durch Kommas getrennte Folge von Bild-Post-IDs.

Um Ihnen den Einstieg zu erleichtern, erfahren Sie hier, wie Sie alle Post-IDs des Anhangs verarbeiten können.

 $image_ids = $wpdb->get_col($wpdb->prepare(" SELECT meta_value FROM {$wpdb->prefix}post_meta WHERE meta_key = '_thumbnail_id' AND post_id in (%s)", explode(',',$prod_ids))); $gallery_ids = $wpdb->get_col($wpdb->prepare(" SELECT meta_value FROM {$wpdb->prefix}post_meta WHERE meta_key = '_product_image_gallery' AND post_id in (%s)", explode(',',$prod_ids))); $gallery_ids = explode(',',$gallery_ids); //get all ids in a single string $gallery_ids = array_unique(implode(',',$gallery_ids)); $image_ids = array_merge($image_ids,$gallery_ids); //do something with all $image_ids 

Und hier kommt der schwierige Teil: Wenden Sie die obige Lösung nur auf Bilder an, die sicher gelöscht werden können.