Usuń powiązane media po usunięciu strony

9

Uwaga

Używaj na własne ryzyko, jest wadliwy i natknąłem się na kilka instancji, w których usuwa WSZYSTKIE załączniki. Nie jestem pewien, dlaczego.

Czy możliwe jest usunięcie multimediów powiązanych ze stroną po usunięciu tej strony? Wiem, że na stronie Wstawianie multimediów można filtrować według obrazów „Przesłane na tę stronę”, więc czy mogę uzyskać ich listę i po prostu usunąć je podczas usuwania strony?

W tej chwili bawię się podłączaniem do Usuń post. W tej chwili ... to nic nie robi, ale myślę, że gdzieś się z tym bawię.

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
źródło
1
Uważaj na usuwanie odniesień do mediów, które są używane w innym miejscu, np. W innych postach lub jeśli Twój post został udostępniony w mediach społecznościowych.
Gilbert,
Cóż, jeśli zmuszę użytkownika do dwukrotnego przesłania tego samego obrazu (jeśli chce tego samego obrazu dla 2 różnych stron), zmieni on nazwę jednego z obrazów, więc powinno być dobrze.
Howdy_McGee

Odpowiedzi:

8

Co powiesz na to? Dostosowuje przykład na stronie referencyjnej funkcji 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
źródło
1
Nie działało dla mnie. Utworzono post dołączony 1 zdjęcie, post na śmieci, pusty kosz. Obraz jest nadal w bibliotece multimediów. EDYCJA: Och, brakuje części dodatkowej
Michael Rogers
8

Przypuszczam, że szukasz czegoś takiego ...?

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
źródło
Nic dla mnie nie robi. Usuwanie wyników postów z niepołączonych multimediów jak zwykle nie powoduje ich usunięcia.
Michael Rogers
Chyba że dostosowałeś kod, dotyczy on tylko stron. Widziałeś to, prawda, @MichaelRogers?
tfrommen
Przepraszam!
Michael Rogers,