wp_delete_post()

You are here:

wp_delete_post( int $postidbool $force_delete = false )

Trash or delete a post or page.

Description Description

When the post and page is permanently deleted, everything that is tied to it is deleted also. This includes comments, post meta fields, and terms associated with the post.

The post or page is moved to Trash instead of permanently deleted unless Trash is disabled, item is already in the Trash, or $force_delete is true.

See also See also

  • wp_delete_attachment()
  • wp_trash_post()

Top ↑

Parameters Parameters

$postid

(int) (Optional) Post ID. Default 0.

$force_delete

(bool) (Optional) Whether to bypass Trash and force deletion.

Default value: false


Top ↑

Return Return

(WP_Post|false|null) Post data on success, false or null on failure.


Top ↑

More Information More Information

wp_delete_post() automatically reverts to wp_trash_post() if $force_delete is false, the post_type of $postid is page or post$postid is not already in the trash and if that trash feature enabled (which it it is by default).


Top ↑

Source Source

File: wp-includes/post.php

2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
function wp_delete_post( $postid = 0, $force_delete = false ) {
    global $wpdb;
 
    $post = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE ID = %d", $postid ) );
 
    if ( ! $post ) {
        return $post;
    }
 
    $post = get_post( $post );
 
    if ( ! $force_delete && ( 'post' === $post->post_type || 'page' === $post->post_type ) && 'trash' !== get_post_status( $postid ) && EMPTY_TRASH_DAYS ) {
        return wp_trash_post( $postid );
    }
 
    if ( 'attachment' === $post->post_type ) {
        return wp_delete_attachment( $postid, $force_delete );
    }
 
    /**
     * Filters whether a post deletion should take place.
     *
     * @since 4.4.0
     *
     * @param bool|null $delete       Whether to go forward with deletion.
     * @param WP_Post   $post         Post object.
     * @param bool      $force_delete Whether to bypass the Trash.
     */
    $check = apply_filters( 'pre_delete_post', null, $post, $force_delete );
    if ( null !== $check ) {
        return $check;
    }
 
    /**
     * Fires before a post is deleted, at the start of wp_delete_post().
     *
     * @since 3.2.0
     * @since 5.5.0 Added the `$post` parameter.
     *
     * @see wp_delete_post()
     *
     * @param int     $postid Post ID.
     * @param WP_Post $post   Post object.
     */
    do_action( 'before_delete_post', $postid, $post );
 
    delete_post_meta( $postid, '_wp_trash_meta_status' );
    delete_post_meta( $postid, '_wp_trash_meta_time' );
 
    wp_delete_object_term_relationships( $postid, get_object_taxonomies( $post->post_type ) );
 
    $parent_data  = array( 'post_parent' => $post->post_parent );
    $parent_where = array( 'post_parent' => $postid );
 
    if ( is_post_type_hierarchical( $post->post_type ) ) {
        // Point children of this page to its parent, also clean the cache of affected children.
        $children_query = $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_parent = %d AND post_type = %s", $postid, $post->post_type );
        $children       = $wpdb->get_results( $children_query );
        if ( $children ) {
            $wpdb->update( $wpdb->posts, $parent_data, $parent_where + array( 'post_type' => $post->post_type ) );
        }
    }
 
    // Do raw query. wp_get_post_revisions() is filtered.
    $revision_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_parent = %d AND post_type = 'revision'", $postid ) );
    // Use wp_delete_post (via wp_delete_post_revision) again. Ensures any meta/misplaced data gets cleaned up.
    foreach ( $revision_ids as $revision_id ) {
        wp_delete_post_revision( $revision_id );
    }
 
    // Point all attachments to this post up one level.
    $wpdb->update( $wpdb->posts, $parent_data, $parent_where + array( 'post_type' => 'attachment' ) );
 
    wp_defer_comment_counting( true );
 
    $comment_ids = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d", $postid ) );
    foreach ( $comment_ids as $comment_id ) {
        wp_delete_comment( $comment_id, true );
    }
 
    wp_defer_comment_counting( false );
 
    $post_meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE post_id = %d ", $postid ) );
    foreach ( $post_meta_ids as $mid ) {
        delete_metadata_by_mid( 'post', $mid );
    }
 
    /**
     * Fires immediately before a post is deleted from the database.
     *
     * @since 1.2.0
     * @since 5.5.0 Added the `$post` parameter.
     *
     * @param int     $postid Post ID.
     * @param WP_Post $post   Post object.
     */
    do_action( 'delete_post', $postid, $post );
 
    $result = $wpdb->delete( $wpdb->posts, array( 'ID' => $postid ) );
    if ( ! $result ) {
        return false;
    }
 
    /**
     * Fires immediately after a post is deleted from the database.
     *
     * @since 2.2.0
     * @since 5.5.0 Added the `$post` parameter.
     *
     * @param int     $postid Post ID.
     * @param WP_Post $post   Post object.
     */
    do_action( 'deleted_post', $postid, $post );
 
    clean_post_cache( $post );
 
    if ( is_post_type_hierarchical( $post->post_type ) && $children ) {
        foreach ( $children as $child ) {
            clean_post_cache( $child );
        }
    }
 
    wp_clear_scheduled_hook( 'publish_future_post', array( $postid ) );
 
    /**
     * Fires after a post is deleted, at the conclusion of wp_delete_post().
     *
     * @since 3.2.0
     * @since 5.5.0 Added the `$post` parameter.
     *
     * @see wp_delete_post()
     *
     * @param int     $postid Post ID.
     * @param WP_Post $post   Post object.
     */
    do_action( 'after_delete_post', $postid, $post );
 
    return $post;
}


Top ↑

Changelog Changelog

Changelog
VersionDescription
1.0.0Introduced.
Was this article helpful?
Dislike 0
Views: 2

Cart

Log in

Create an Account
Back to Top