Override wp_delete_post and move to trash instead for custom post type

by wharfdale   Last Updated August 01, 2020 13:08 PM

The function wp_delete_post() will permanently delete when used on Custom Post Types. The force flag only works on PAGE and POST cpt.

See this post as an explanation of how the force flag is being used: wp_delete_post() deletes post instead of moving it to trash

Question: A plugin I have is using this function, and I want to try hook in to wp_delete_post and move the item to trash instead of permanently deleting.

Is it possible to use before_delete_post to try move things to the trash before it reaches the stage of permanently deleting?

Alternative: Don't have the item deleted at all. In my case I would be happy to update the post status or some meta key and then I'll run a permanent delete on those products with that meta key at a later date.

My attempt so far - this test is simply to try see if I can prevent the full wp_post_delete from running. This did not work, the post was permanently deleted still.

function delete_handler($postid){
  return false;
add_action('before_delete_post', __NAMESPACE__.'\\delete_handler');
Tags : hooks

Answers 2

Inside wp_delete_post() there is the following code,

 * 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;

So I think with the following filtering you might be able to prevent the deletion.

function prevent_cpt_delete( $delete, $post, $force_delete ) {
  // Is it my post type someone is trying to delete?
  if ( 'my_post_type' === $post->post_type && ! $force_delete ) {
    // Try to trash the cpt instead
    return wp_trash_post( $post->ID ); // returns (WP_Post|false|null) Post data on success, false or null on failure.
  return $delete;  
add_filter('pre_delete_post', 'prevent_cpt_delete', 10, 3);
Antti Koskinen
Antti Koskinen
February 08, 2020 12:40 PM

I added the above codes but it still doesn't work. Images of post deleted but post do not move to trash

August 01, 2020 12:32 PM

Related Questions

Can't find correct hook for user data saving

Updated April 14, 2015 20:03 PM

What is "all" in isset($wp_filter['all])

Updated May 14, 2016 08:03 AM

hook that when page is strating to load

Updated June 19, 2015 03:03 AM

Which hook runs first: init or admin_init?

Updated June 27, 2015 20:03 PM