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