问题描述

我有一个自定义帖子类型的概述。这些都有定制税和附件。

在我的概述中,我需要提供删除条目的链接。因此,我还需要删除附件和元数据。

我在用这个:

    if ( !current_user_can( 'delete_bkroadkill', $post->ID ) )
        return;

    $link = "<a href='" . wp_nonce_url( get_bloginfo('url') . "/wp-admin/post.php?action=delete&amp;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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。