wp_delete_attachment

Estou tentando excluir todos os anexos de um tipo de postagem personalizado na exclusão de postagem usando o gancho before_delete_post.

Ele funciona ok, exceto que se eu adicionar outra function para replace o diretório de upload, ele não exclui os arquivos.

Aqui está o código em uso:

function set_upload_dir( $args ) { $id = ( isset( $_REQUEST['post_id'] ) ? $_REQUEST['post_id'] : '' ); if( $id ) { $newdir = '/' . get_post_type( $id ); $args['path'] = str_replace( $args['subdir'], '', $args['path'] ); $args['url'] = str_replace( $args['subdir'], '', $args['url'] ); $args['subdir'] = $newdir; $args['path'] .= $newdir; $args['url'] .= $newdir; return $args; } } add_filter( 'upload_dir', 'set_upload_dir' ); function delete_post_media($post_id) { //if ('galleries' != get_post_type($id)) return; $attachments = get_attached_media( '', $post->ID ); foreach ( $attachments as $attachment ) { if ( false === wp_delete_attachment( $attachment->ID, true ) ) { } } } add_action('before_delete_post', ' delete_post_media'); add_action('wp_trash_post', 'delete_post_media'); 

Alguma opinião sobre o problema?

Desde já, obrigado.

Solutions Collecting From Web of "wp_delete_attachment"

Experimente o seguinte:

  1. Substitua seu filtro de upload atual por aquele abaixo
  2. Crie uma nova postagem personalizada e faça o upload de alguns arquivos
  3. Verifique se os arquivos foram movidos para a pasta de uploads correta
  4. Exclua a postagem personalizada e, em seguida, verifique se os arquivos foram excluídos

Nova function de filtro de carregamento:

 function set_upload_dir( $args ) { if ( ! empty( $_REQUEST['post_id'] ) && $post_id = absint( $_REQUEST['post_id'] ) ) { if ( $post = get_post( $post_id ) ) { if ( $post->post_type !== 'attachment' ) { $args['subdir'] = "/$post->post_type"; // Must be preceded with slash $args['path'] = $args['basedir'] . $args['subdir']; $args['url'] = $args['baseurl'] . $args['subdir']; } } } return $args; } 

As principais diferenças entre este e o seu são:

  1. Verificamos de forma agressiva o contexto do post ( post_id ) é válido e não é um anexo em si. Lembre-se, este filtro é chamado em todo o lugar, não apenas quando uma imagem é carregada.
  2. Use os argumentos baseurl e baseurl vez da substituição de string. Seus caminhos poderiam, de outra forma, acabar com barras duplas (ou mesmo faltando).

Uma vez que uma imagem é carregada, o subdir é armazenado no database e o WordPress só usará o basedir ao tentar recuperar o caminho do arquivo.

Em outras palavras, as coisas não serão interrompidas se o wp_upload_dir for chamado para um anexo de postagem personalizado fora do contexto e o subdir retornado não é realmente onde o arquivo reside.