Zugehörige Medien beim Löschen der Seite löschen

9

Hinweis

Die Verwendung erfolgt auf eigenes Risiko. Es ist fehlerhaft und ich bin auf einige Fälle gestoßen, in denen ALLE Anhänge gelöscht wurden. Unsicher warum.

Ist es möglich, einer Seite zugeordnete Medien zu löschen, wenn diese Seite gelöscht wird? Ich weiß, dass Sie auf der Seite "Medien einfügen" nach Bildern filtern können, die auf diese Seite hochgeladen wurden. Könnte ich also eine Liste dieser Bilder erhalten und sie einfach löschen, während die Seite gelöscht wird?

Im Moment spiele ich mit dem Einhängen in "Post löschen". Im Moment ... macht es nichts, aber ich denke, ich komme damit irgendwohin.

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
quelle
1
Achten Sie darauf, dass Sie keine Verweise auf Medien löschen, die an anderer Stelle verwendet werden, z. B. auf andere Beiträge oder wenn Ihr Beitrag in sozialen Medien geteilt wurde.
Gilbert
Wenn ich den Benutzer zwinge, dasselbe Bild zweimal hochzuladen (wenn er dasselbe Bild für zwei verschiedene Seiten haben möchte), wird eines der Bilder umbenannt, daher sollte es in Ordnung sein.
Howdy_McGee

Antworten:

8

Wie wäre es damit? Es passt ein Beispiel auf der Funktionsreferenzseite get_posts () an .

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
quelle
1
Hat bei mir nicht funktioniert. Erstellt Beitrag angehängt 1 Bild, Papierkorb, leerer Papierkorb. Das Bild befindet sich noch in der Medienbibliothek. EDIT: Oh, es fehlt der add_action Teil
Michael Rogers
8

Ich nehme an, Sie suchen so etwas ...?

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
quelle
Tut nichts für mich. Wenn Sie die Post-Ergebnisse auf nicht angehängten Medien wie gewohnt löschen, werden sie nicht gelöscht.
Michael Rogers
Sofern Sie den Code nicht angepasst haben, gilt er nur für Seiten. Du hast das gesehen, richtig, @MichaelRogers?
tfrommen
Tut mir leid, dann!
Michael Rogers