@s\\u ha\\u dum建议Post meta将自动删除。因此,因为他的名声表明他知道自己在说什么,所以这个解决方案只处理帖子附件。
我建议检查一下before_delete_post() 钩子,因为它非常方便,可以检查哪些帖子类型正在被删除,等等。
add_action(\'before_delete_post\', \'delete_post_attachments\');
function delete_post_attachments($post_id){
global $post_type;
if($post_type !== \'my_custom_post_type\') return;
global $wpdb;
$args = array(
\'post_type\' => \'attachment\',
\'post_status\' => \'any\',
\'posts_per_page\' => -1,
\'post_parent\' => $post_id
);
$attachments = new WP_Query($args);
$attachment_ids = array();
if($attachments->have_posts()) : while($attachments->have_posts()) : $attachments->the_post();
$attachment_ids[] = get_the_id();
endwhile;
endif;
wp_reset_postdata();
if(!empty($attachment_ids)) :
$delete_attachments_query = $wpdb->prepare(\'DELETE FROM %1$s WHERE %1$s.ID IN (%2$s)\', $wpdb->posts, join(\',\', $attachment_ids));
$wpdb->query($delete_attachments_query);
endif;
}
An important note from the aforementioned docs - 需要注意的是,钩子只有在WordPress用户清空垃圾时才会运行。如果使用此钩子,请注意,如果用户正在删除附件,则不会触发该钩子,因为附件是强制删除的,即不会发送到垃圾箱。而是使用delete_post() 钩
Another note
我应该提到的是,虽然这个答案中的代码将删除数据库中与Post附件相关的所有行,但它实际上不会删除附件本身。
我的理由是性能。根据您拥有的附件数量,一次删除一个附件可能需要一段时间。我建议最好一开始只删除所有附件的数据库条目,以增强用户体验,然后在另一个时间运行一些单独的内部管理来删除实际的附件(搜索和删除非关联文件很容易)。基本上,更少的查询+用户体验期间更少的工作=更少的时间。