The delete_postmeta WordPress action fires immediately before deleting metadata for a post.
Usage
add_action('delete_postmeta', 'your_custom_function'); function your_custom_function($meta_ids) { // your custom code here }
Parameters
$meta_ids
(string[]): An array of metadata entry IDs to delete.
More information
See WordPress Developer Resources: delete_postmeta
Examples
Log Deleted Metadata
Log all deleted metadata in a text file.
add_action('delete_postmeta', 'log_deleted_metadata'); function log_deleted_metadata($meta_ids) { foreach ($meta_ids as $meta_id) { $meta_value = get_metadata_by_mid('post', $meta_id); error_log("Deleted metadata - ID: $meta_id, Value: $meta_value->meta_value\n", 3, 'deleted_metadata.log'); } }
Prevent Specific Metadata Deletion
Prevent deletion of metadata with a specific key.
add_action('delete_postmeta', 'prevent_specific_meta_deletion'); function prevent_specific_meta_deletion($meta_ids) { global $wpdb; $meta_key_to_protect = 'protected_meta_key'; $ids = implode(',', array_map('intval', $meta_ids)); $wpdb->query("DELETE FROM $wpdb->postmeta WHERE meta_id NOT IN ($ids) AND meta_key = '$meta_key_to_protect'"); }
Notify Admin on Metadata Deletion
Send an email to the admin when metadata is deleted.
add_action('delete_postmeta', 'notify_admin_on_meta_deletion'); function notify_admin_on_meta_deletion($meta_ids) { $admin_email = get_option('admin_email'); $subject = 'Metadata Deleted'; $message = "The following metadata IDs were deleted:\n\n" . implode(", ", $meta_ids); wp_mail($admin_email, $subject, $message); }
Remove Associated Attachment on Metadata Deletion
Delete an attachment when its related metadata is deleted.
add_action('delete_postmeta', 'remove_associated_attachment'); function remove_associated_attachment($meta_ids) { foreach ($meta_ids as $meta_id) { $meta = get_metadata_by_mid('post', $meta_id); if ($meta->meta_key === 'attachment_id') { wp_delete_attachment($meta->meta_value, true); } } }
Update Cache on Metadata Deletion
Update the cache when post metadata is deleted.
add_action('delete_postmeta', 'update_cache_on_meta_deletion'); function update_cache_on_meta_deletion($meta_ids) { foreach ($meta_ids as $meta_id) { $meta = get_metadata_by_mid('post', $meta_id); $post_id = $meta->post_id; clean_post_cache($post_id); } }