问题描述
我有一个自定义帖子类型的概述。这些都有定制税和附件。
在我的概述中,我需要提供删除条目的链接。因此,我还需要删除附件和元数据。
我在用这个:
if ( !current_user_can( 'delete_bkroadkill', $post->ID ) )
return;
$link = "<a href='" . wp_nonce_url( get_bloginfo('url') . "/wp-admin/post.php?action=delete&post=" . $post->ID, 'delete-post_' . $post->ID) . "'>".$link."</a>";
echo $before . $link . $after;
我发现 Delete Post Link to delete post, its meta and attachments,但没有提供任何解决方案。
哪些不会删除除帖子以外的其他内容。这样做的正确方法是什么?
最佳解决方案
@s_ha_dum 建议 Post meta 将被自动删除。因此,因为他的声誉表明他知道他在说什么,这个解决方案只能处理 Post 附件。
我建议检查 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;
}
上述文件的一个重要注意事项 –
重要的是要注意,只有当 WordPress 用户清空垃圾箱时,挂钩才会运行。如果您使用此挂钩注释,如果用户正在删除附件,则不会触发,因为附件被强制删除,即不会发送到废纸篓。而是使用 delete_post()钩子。
另一个注释
我应该提到,虽然此答案中的代码将删除与 Post 附件相关的数据库中的所有行,但实际上它们实际上不会删除附件。
我的理由是表现。根据您拥有的附件数量,一次删除它们可能需要一段时间。我建议最好只删除所有附件的数据库条目,以增强用户体验,然后在另一个时间运行一些单独的房屋删除实际附件 (搜索和删除 non-associated 文件是很容易的) 。基本上,在用户体验期间,较少的查询+更少的工作=更少的时间。
次佳解决方案
我用这个来删除相关的媒体。如果您想要针对某个帖子类型进行测试,则可以包含 global $post_type
变量。几乎所有的附件都会被逐一删除。 Reference
function delete_associated_media( $id ) {
$media = get_children( array(
'post_parent' => $id,
'post_type' => 'attachment'
) );
if( empty( $media ) ) {
return;
}
foreach( $media as $file ) {
wp_delete_attachment( $file->ID );
}
}
add_action( 'before_delete_post', 'delete_associated_media' );
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。