Diretório de upload personalizado por CPT; quando removido, o arquivo não foi excluído

Eu tenho esse código em functions.php que organiza o upload de mídia de acordo com seu Custom Post Type (CPT).

Assim, todas as imagens carregadas para um CPT “Product” estarão dentro do diretório 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; } }); 

Funciona bem, exceto quando eu excluir a mídia, o arquivo ainda está lá (a input do database é excluída apenas).

Achei que precisava também filtrar a exclusão de mídia , mas não consigo achar o caminho certo. Alguém conseguiu configurar isso com sucesso?

obrigado

EDITAR

Eu tentei adicionar condicional para usar a pasta padrão quando o tipo de post é post .

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

A exclusão da mídia de um post também não irá excluir o arquivo.

Solutions Collecting From Web of "Diretório de upload personalizado por CPT; quando removido, o arquivo não foi excluído"

Um pequeno erro, o return deve estar fora if

 add_filter("upload_dir", function ($args) { $id = (isset($_REQUEST["post_id"]) ? $_REQUEST["post_id"] : ""); if($id) { $newdir = "/" . get_post_type($id); ... } return $args; }); 

Nós fizemos algo bastante semelhante no nosso plugin recentemente. Veja como lidamos com exclusões de mídia somente quando uma de nossas postagens está sendo excluída.

 / **
  * Exclua todas as mídias anexadas quando um produto é excluído
  * /
 function product_delete_attached_media ($ post_id) {

     // Se não é um produto a ser excluído, não queremos fazer nada
     se ('produto'! = get_post_type ($ post_id))
         Retorna;

     // Configura os argumentos para uma consulta personalizada
     $ args = array (
         'post_type' => 'attachment', // Queremos anexos ...
         'posts_per_page' => -1, // ... todos eles ...
         'post_status' => 'any', // ... não importa se público, no lixo etc. ...
         'post_parent' => $ post_id // ... que é filho do produto que está sendo excluído aqui!
     );

     // Faça uma consulta personalizada com esses argumentos para obter esses anexos
     $ attachments = new WP_Query ($ args);

     // Percorra cada um deles e exclua-os
     foreach ($ attachments-> posts como $ attachment) {
         se (false === wp_delete_attachment ($ attachment-> ID, true)) {
             // Aqui você pode gerar ou registrar algo se algo der certo
         }
     }
 }

 // Adicionamos esta function ao gancho "before_delete_post"
 // que é executado antes de cada exclusão de uma publicação
 add_action ('before_delete_post', 'product_delete_attached_media');

Os comentários devem explicar o que está acontecendo bastante bem. A function wp_delete_attachment () cuida da exclusão dos arquivos de mídia e deve excluir com sucesso os arquivos, bem como as inputs no database.

A única coisa que tivemos que fazer em cima disso foi remover toda a estrutura de pastas personalizadas se o nosso plugin for desinstalado.

Além disso, tenho certeza de que o WP_Query pode ser otimizado, pois poderá ficar devagar se você tiver uma tonelada de posts e imagens.

Espero que ajude.