The pre_delete_attachment filter lets you control if an attachment should be deleted, or if it should be bypassed before the deletion takes place.
Usage
add_filter('pre_delete_attachment', '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 proceed with deletion or not.$post(WP_Post) – The post object representing the attachment.$force_delete(bool) – Whether to bypass the Trash or not.
More information
See WordPress Developer Resources: pre_delete_attachment
Examples
Prevent Deletion of PDF Attachments
This example prevents the deletion of any PDF attachments in your WordPress site.
add_filter('pre_delete_attachment', 'prevent_pdf_deletion', 10, 3);
function prevent_pdf_deletion($delete, $post, $force_delete) {
if ('application/pdf' === $post->post_mime_type) {
return false;
}
return $delete;
}
Allow Deletion Only for Administrators
This example allows only administrators to delete attachments.
add_filter('pre_delete_attachment', 'allow_admin_only_deletion', 10, 3);
function allow_admin_only_deletion($delete, $post, $force_delete) {
if (!current_user_can('administrator')) {
return false;
}
return $delete;
}
Bypass Trash for Image Attachments
This example forces image attachments to be deleted permanently without going to the Trash.
add_filter('pre_delete_attachment', 'bypass_trash_for_images', 10, 3);
function bypass_trash_for_images($delete, $post, $force_delete) {
if (0 === strpos($post->post_mime_type, 'image/')) {
return null;
}
return $delete;
}
Send Email Notification Before Deleting Attachments
This example sends an email notification to the administrator before deleting an attachment.
add_filter('pre_delete_attachment', 'email_before_deletion', 10, 3);
function email_before_deletion($delete, $post, $force_delete) {
$admin_email = get_option('admin_email');
$subject = "Attachment Deleted: {$post->post_title}";
$message = "The following attachment has been deleted: {$post->post_title} (ID: {$post->ID})";
wp_mail($admin_email, $subject, $message);
return $delete;
}
Log Attachment Deletion
This example logs the deletion of an attachment in a custom log file.
add_filter('pre_delete_attachment', 'log_attachment_deletion', 10, 3);
function log_attachment_deletion($delete, $post, $force_delete) {
$log_file = WP_CONTENT_DIR . '/deletion_log.txt';
$log_entry = date('Y-m-d H:i:s') . " - Attachment Deleted: {$post->post_title} (ID: {$post->ID})" . PHP_EOL;
file_put_contents($log_file, $log_entry, FILE_APPEND | LOCK_EX);
return $delete;
}