Excluir mídia associada ao excluir a página

9

Nota

Use por sua conta e risco, é de buggy e já deparei com algumas instâncias em que ele excluiria TODOS os anexos. Não sei por quê.

É possível excluir a mídia associada a uma página quando essa página é excluída? Sei que, na página Inserir mídia, você pode filtrar por imagens "Carregadas nesta página" para obter uma lista dessas e excluí-las à medida que a página está sendo excluída?

No momento, estou brincando de conectar-se ao Delete Post. No momento ... não faz nada, mas acho que estou chegando a algum lugar com isso.

function del_post_media($pid) {
    $query = "DELETE FROM wp_postmeta
            WHERE ".$pid." IN
            (
            SELECT id
            FROM wp_posts
            WHERE post_type = 'attachment'
            )";
    global $wpdb;
    if ($wpdb->get_var($wpdb->prepare($query))) {
        return $wpdb->query($wpdb->prepare($query));
    }
    return true;
}
add_action('delete_post', 'del_post_media');
Howdy_McGee
fonte
11
Tenha cuidado ao excluir referências à mídia que são usadas em outros lugares, por exemplo, outras postagens ou se sua postagem foi compartilhada nas mídias sociais.
Gilbert
Bem, se eu forçar o usuário a carregar a mesma imagem duas vezes (se eles quiserem a mesma imagem para 2 páginas diferentes), ele renomeará uma das imagens, por isso deve ficar bem.
Howdy_McGee

Respostas:

8

Que tal agora? Ele adapta um exemplo na página de referência da função get_posts () .

function delete_post_media( $post_id ) {

    $attachments = get_posts( array(
        'post_type'      => 'attachment',
        'posts_per_page' => -1,
        'post_status'    => 'any',
        'post_parent'    => $post_id
    ) );

    foreach ( $attachments as $attachment ) {
        if ( false === wp_delete_attachment( $attachment->ID ) ) {
            // Log failure to delete attachment.
        }
    }
}

add_action( 'before_delete_post', 'delete_post_media' );
Charles Clarkson
fonte
11
Não funcionou para mim. A postagem criada anexou 1 imagem, a postagem na lixeira, a lixeira vazia. A imagem ainda está lá na biblioteca de mídia. EDIT: Oh, está faltando a parte add_action
Michael Rogers
8

Suponho que você esteja procurando algo assim ...?

function delete_associated_media($id) {
    // check if page
    if ('page' !== get_post_type($id)) return;

    $media = get_children(array(
        'post_parent' => $id,
        'post_type' => 'attachment'
    ));
    if (empty($media)) return;

    foreach ($media as $file) {
        // pick what you want to do
        wp_delete_attachment($file->ID);
        unlink(get_attached_file($file->ID));
    }
}
add_action('before_delete_post', 'delete_associated_media');
tfrommen
fonte
Não faz nada para mim. A exclusão dos resultados da postagem na mídia desanexada, como de costume, não a exclui.
Michael Rogers
A menos que você tenha adaptado o código, é apenas para páginas. Você viu isso, certo, @ MichaelRogers?
precisa saber é o seguinte
Gotcha desculpe então!
Michael Rogers