it-swarm.com.de

Beiträge mit Meta und Anhängen korrekt löschen

Ich habe eine Übersicht über benutzerdefinierte Beitragstypen. Diese haben Zollabgabe und auch einen Anhang.

In meiner Übersicht muss ich Links bereitstellen, um die Einträge zu löschen. Damit muss ich auch den Anhang und die Metadaten löschen.

Ich habe das benutzt:

    if ( !current_user_can( 'delete_bkroadkill', $post->ID ) )
        return;

    $link = "<a href='" . wp_nonce_url( get_bloginfo('url') . "/wp-admin/post.php?action=delete&amp;post=" . $post->ID, 'delete-post_' . $post->ID) . "'>".$link."</a>";
    echo $before . $link . $after;

Ich habe gefunden Beitrag löschen Link zum Löschen des Beitrags, seiner Metas und Anhänge aber es gibt keine Lösung.

Womit nichts anderes als der Beitrag gelöscht wird. Was ist der richtige Weg, um dies zu tun?

7
4ndro1d

@s_ha_dum schlägt vor, dass Post-Meta automatisch gelöscht wird. Aus diesem Grund behandelt diese Lösung nur Post-Anhänge, da sein Ruf darauf hindeutet, dass er weiß, wovon er spricht.

Ich würde vorschlagen, die Dokumente für den before_delete_post () -Hook auszulesen, da es sehr praktisch ist, herauszufinden, welcher Beitragstyp gelöscht wird usw.

add_action('before_delete_post', 'delete_post_attachments');
function delete_post_attachments($post_id){

    global $post_type;   
    if($post_type !== 'my_custom_post_type') return;

    global $wpdb;

    $args = array(
        'post_type'         => 'attachment',
        'post_status'       => 'any',
        'posts_per_page'    => -1,
        'post_parent'       => $post_id
    );
    $attachments = new WP_Query($args);
    $attachment_ids = array();
    if($attachments->have_posts()) : while($attachments->have_posts()) : $attachments->the_post();
            $attachment_ids[] = get_the_id();
        endwhile;
    endif;
    wp_reset_postdata();

    if(!empty($attachment_ids)) :
        $delete_attachments_query = $wpdb->prepare('DELETE FROM %1$s WHERE %1$s.ID IN (%2$s)', $wpdb->posts, join(',', $attachment_ids));
        $wpdb->query($delete_attachments_query);
    endif;

}

Ein wichtiger Hinweis aus den oben genannten Dokumenten -

Es ist wichtig zu beachten, dass der Hook nur ausgeführt wird, wenn der WordPress-Benutzer den Papierkorb leert. Wenn Sie diesen Hook verwenden, wird er nicht ausgelöst, wenn der Benutzer einen Anhang löscht, da Anhänge zwangsweise gelöscht werden, d. H. Nicht in den Papierkorb verschoben werden. Verwenden Sie stattdessen den delete_post () hook.

Noch ein Hinweis

Ich sollte erwähnen, dass der Code in dieser Antwort zwar alle Zeilen aus der Datenbank löscht, die sich auf Post-Anhänge beziehen, die Anhänge selbst jedoch nicht.

Meine Argumentation dafür ist Leistung. Abhängig von der Anzahl der Anhänge kann das Löschen nacheinander eine Weile dauern. Ich empfehle, zunächst nur die Datenbankeinträge für alle Anhänge zu löschen, um die Benutzererfahrung zu verbessern, und dann zu einem anderen Zeitpunkt ein separates Housekeeping durchzuführen, um die tatsächlichen Anhänge zu löschen (das Suchen und Löschen von Anhängen ohne Zuordnung ist einfach genug) Dateien). Grundsätzlich bedeutet weniger Anfragen + weniger Arbeit während der Benutzererfahrung = weniger Zeit.

5
David Gard

Ich benutze dies, um zugeordnete Medien mit Post zu löschen. Wenn Sie mit einem bestimmten Beitragstyp testen möchten, können Sie die Variable global $post_type einschließen. So ziemlich alle Anhänge werden abgerufen und nacheinander gelöscht. Referenz

function delete_associated_media( $id ) {
    $media = get_children( array(
        'post_parent' => $id,
        'post_type'   => 'attachment'
    ) );

    if( empty( $media ) ) {
        return;
    }

    foreach( $media as $file ) {
        wp_delete_attachment( $file->ID );
    }
}
add_action( 'before_delete_post', 'delete_associated_media' );
9
Howdy_McGee