web-dev-qa-db-fra.com

Répertoire de téléchargement personnalisé par CPT; lors de la suppression, fichier non supprimé

J'ai ce code dans functions.php qui organise le téléchargement de média en fonction de son type de message personnalisé (CPT).

Ainsi, toutes les images téléchargées vers un CPT "Produit" seront dans le répertoire 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;
  }
});

Cela fonctionne bien, sauf que lorsque je supprime le support, le fichier est toujours là (l'entrée de base de données est supprimée parfaitement).

J'ai pensé que je devais filtrer la suppression de média aussi, mais je n'arrive pas à trouver le bon chemin. Quelqu'un at-il réussi à mettre cela en place?

Merci

MODIFIER

J'ai essayé d'ajouter conditionnel pour utiliser le dossier par défaut lorsque le type de publication est post.

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

La suppression du support d'une publication ne supprimera pas non plus le fichier.

5
hrsetyono

Une petite erreur, le return devrait être à l'extérieur if

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

Nous avons fait quelque chose d'assez similaire dans notre plugin récemment. Voici comment nous traitons les suppressions de médias uniquement lorsqu'un de nos nos posts est en cours de suppression.

/** 
 * Supprimer tous les supports joints lorsqu'un produit est supprimé 
 */
 Function product_delete_attached_media ($ post_id) {
 
 // Si ce n'est pas un produit en cours de suppression, nous ne voulons rien faire 
 If ('product'! = Get_post_type ($ post_id)) 
 Return; 
 
 // Configure les arguments d'une requête personnalisée 
 $ Args = array (
 'Post_type' => 'pièce jointe', // Nous voulons des pièces jointes ... 
 'posts_per_page' => -1, // ... tous ... 
 'post_status' => 'any', // ... peu importe si elle est publique, dans la corbeille, etc. . 
 'post_parent' => $ post_id // ... qui sont des enfants du produit en cours de suppression ici! 
); 
 
 // Faites vos achats interroger avec ces arguments pour obtenir ces pièces jointes 
 $ attachments = new WP_Query ($ args); 
 
 // Faites une boucle dans chacun d’eux et supprimez-les 
 pour chaque ($ attachments-> posts as $ attachment) {
 if (false === wp_delete_attachment ($ attachment-> ID, true)) {
 // Ici, vous pouvez générer ou consigner quelque chose si quelque chose ne va pas 
} 
 } 
} 
 
 // Nous ajoutons cette fonction au hook "before_delete_post" 
 // qui s'exécute avant chaque suppression d'un message 
 Add_action ('before_delete_post', 'product_delete_attached_media'); 

Les commentaires devraient expliquer assez bien ce qui se passe. La fonction wp_delete_attachment () prend en charge la suppression des fichiers multimédias et doit supprimer les fichiers ainsi que les entrées de la base de données.

La seule chose à faire était de supprimer toute la structure des dossiers personnalisés si notre plugin était désinstallé.

De plus, je suis à peu près sûr que WP_Query pourrait être optimisé car il pourrait potentiellement devenir lent si vous avez une tonne de messages et d'images.

J'espère que cela pourra aider.

1
Claudio Rimann