it-swarm.com.de

Benutzerdefiniertes Upload-Verzeichnis pro CPT; Beim Entfernen wird die Datei nicht gelöscht

Ich habe diesen Code in functions.php, der das Hochladen von Medien nach dem benutzerdefinierten Beitragstyp (CPT) organisiert.

Alle Bilder, die in ein "Produkt" -CPT hochgeladen werden, befinden sich im Verzeichnis wp-content/uploads/product.

add_filter("upload_dir", function ($args) {
  $id = (isset($_REQUEST["post_id"]) ? $_REQUEST["post_id"] : "");

  if($id) {
    $newdir = "/" . get_post_type($id);

    // remove default dir
    $args["path"] = str_replace( $args["subdir"], "", $args["path"]);
    $args["url"] = str_replace( $args["subdir"], "", $args["url"]);

    // assign new dir
    $args["subdir"] = $newdir;
    $args["path"] .= $newdir; 
    $args["url"] .= $newdir;

    return $args;
  }
});

Es funktioniert gut, außer wenn ich den Datenträger lösche, ist die Datei noch vorhanden (der Datenbankeintrag wird einwandfrei gelöscht).

Ich dachte, ich muss das Löschen von Medien filtern auch, kann aber anscheinend nicht den richtigen Weg finden. Hat jemand dies erfolgreich eingerichtet?

Vielen Dank

EDIT

Ich habe versucht, einen bedingten Ordner hinzuzufügen, um den Standardordner zu verwenden, wenn der Beitragstyp post ist.

if(get_post_type($id) === "post") {
  return $args;
} else {
  ...
}

Durch das Löschen des Mediums eines Posts wird die Datei auch nicht gelöscht.

5
hrsetyono

Ein kleiner Fehler, die return sollte außerhalb von if liegen

add_filter("upload_dir", function ($args) {
  $id = (isset($_REQUEST["post_id"]) ? $_REQUEST["post_id"] : "");

  if($id) {
    $newdir = "/" . get_post_type($id);
    ...
  }

  return $args;
});
2
hrsetyono

Wir haben in letzter Zeit etwas ziemlich Ähnliches in unserem Plugin gemacht. Hier erfahren Sie, wie Medienlöschungen nur dann behandelt werden, wenn einer derunsererPosts gelöscht wird.

/** 
 * Alle angehängten Medien löschen, wenn ein Produkt gelöscht wird 
 */
 Funktion product_delete_attached_media ($ post_id) {
 
 // Wenn kein Produkt gelöscht wird, möchten wir nichts tun 
 If ('product'! = Get_post_type ($ post_id)) 
 Return; 
 
 // Richten Sie die Argumente für eine benutzerdefinierte Abfrage ein 
 $ Args = array (
 'Post_type' => 'attachment', // Wir möchten Anhänge ... 
 'posts_per_page' => -1, // ... alle ... 
 'post_status' => 'any', // ... egal ob öffentlich, im Papierkorb etc. .. . 
 'post_parent' => $ post_id // ... die ein Kind des Produkts sind, das hier gelöscht wird! 
); 
 
 // Benutzerdefiniert fragen Sie mit diesen Argumenten ab, um diese Anhänge zu erhalten 
 $ attachments = new WP_Query ($ args); 
 
 // Durchlaufen Sie jeden einzelnen von ihnen und löschen Sie sie 
 foreach ($ attachments-> posts als $ attachment) {
 if (false === wp_delete_attachment ($ attachment-> ID, true)) {
 // Hier können Sie etwas ausgeben oder protokollieren, wenn etwas schief gelaufen ist 
} 
 } 
} 
 
 // Wir fügen diese Funktion dem Hook "before_delete_post" 
 // hinzu, der vor jedem Löschen einer post 
 Add_action ausgeführt wird ('before_delete_post', 'product_delete_attached_media'); 

Die Kommentare sollten erklären, was ganz gut läuft. Die Funktion wp_delete_attachment () sorgt für das Löschen der Mediendateien und sollte die Dateien sowie die Einträge in der Datenbank erfolgreich löschen.

Darüber hinaus mussten wir nur die gesamte benutzerdefinierte Ordnerstruktur entfernen, wenn unser Plugin deinstalliert wurde.

Außerdem bin ich mir ziemlich sicher, dass die WP_Query optimiert werden könnte, da sie möglicherweise langsam wird, wenn Sie eine Menge Beiträge und Bilder haben.

Hoffentlich hilft das.

1
Claudio Rimann