pre_delete_post is a WordPress PHP filter that allows you to control whether a post deletion should take place or not.
Usage
add_filter('pre_delete_post', 'your_custom_function', 10, 3); function your_custom_function($delete, $post, $force_delete) { // your custom code here return $delete; }
Parameters
$delete (WP_Post|false|null)
– Whether to go forward with deletion.$post (WP_Post)
– The post object to be deleted.$force_delete (bool)
– Whether to bypass the Trash.
More information
See WordPress Developer Resources: https://developer.wordpress.org/reference/hooks/pre_delete_post/
Examples
Prevent deletion of a specific post
Prevent deletion of a post with the ID of 42.
add_filter('pre_delete_post', 'prevent_specific_post_deletion', 10, 3); function prevent_specific_post_deletion($delete, $post, $force_delete) { if ($post->ID == 42) { return false; } return $delete; }
Disable force delete for all posts
Disable force delete and move all posts to Trash, even if $force_delete
is set to true
.
add_filter('pre_delete_post', 'disable_force_delete', 10, 3); function disable_force_delete($delete, $post, $force_delete) { return $delete && !$force_delete; }
Prevent deletion of posts with specific tag
Prevent deletion of posts tagged “important”.
add_filter('pre_delete_post', 'prevent_important_post_deletion', 10, 3); function prevent_important_post_deletion($delete, $post, $force_delete) { if (has_tag('important', $post)) { return false; } return $delete; }
Allow deletion only for admins
Allow post deletion only for administrators.
add_filter('pre_delete_post', 'allow_deletion_for_admins', 10, 3); function allow_deletion_for_admins($delete, $post, $force_delete) { if (current_user_can('manage_options')) { return $delete; } return false; }
Prevent deletion of published posts
Prevent deletion of posts that have a “publish” status.
add_filter('pre_delete_post', 'prevent_published_post_deletion', 10, 3); function prevent_published_post_deletion($delete, $post, $force_delete) { if ($post->post_status == 'publish') { return false; } return $delete; }