删除页面后删除关联的媒体


9

注意

使用时需要您自担风险,它存在错误,并且我在多个实例中遇到过删除所有附件的情况。不确定为什么。

删除与该页面关联的媒体时,该页面是否可以删除?我知道您可以在“插入媒体”页面中按“上传到此页面”图像进行筛选,因此我可以获取这些列表并在删除页面时将其删除吗?

现在,我正在玩弄“删除帖子”。现在...它什么也没做,但我想我已经知道了。

function del_post_media($pid) {
    $query = "DELETE FROM wp_postmeta
            WHERE ".$pid." IN
            (
            SELECT id
            FROM wp_posts
            WHERE post_type = 'attachment'
            )";
    global $wpdb;
    if ($wpdb->get_var($wpdb->prepare($query))) {
        return $wpdb->query($wpdb->prepare($query));
    }
    return true;
}
add_action('delete_post', 'del_post_media');

1
请小心删除对其他地方使用的媒体的引用,例如其他帖子,或者您的帖子已在社交媒体上共享。
吉尔伯特

好吧,如果我强迫用户上载同一张图片两次(如果他们希望同一张图片用于2个不同的页面),它将重命名其中一张图片,因此应该没问题。
Howdy_McGee

Answers:


8

这个怎么样?它改编了get_posts()函数参考页上的示例。

function delete_post_media( $post_id ) {

    $attachments = get_posts( array(
        'post_type'      => 'attachment',
        'posts_per_page' => -1,
        'post_status'    => 'any',
        'post_parent'    => $post_id
    ) );

    foreach ( $attachments as $attachment ) {
        if ( false === wp_delete_attachment( $attachment->ID ) ) {
            // Log failure to delete attachment.
        }
    }
}

add_action( 'before_delete_post', 'delete_post_media' );

1
没为我工作。已创建帖子,附有1张图片,已删除帖子,已清空垃圾箱。图像仍在媒体库中。编辑:哦,它缺少add_action部分
Michael Rogers

8

我想您正在寻找类似的东西...?

function delete_associated_media($id) {
    // check if page
    if ('page' !== get_post_type($id)) return;

    $media = get_children(array(
        'post_parent' => $id,
        'post_type' => 'attachment'
    ));
    if (empty($media)) return;

    foreach ($media as $file) {
        // pick what you want to do
        wp_delete_attachment($file->ID);
        unlink(get_attached_file($file->ID));
    }
}
add_action('before_delete_post', 'delete_associated_media');

什么都不做。像往常一样在未连接的媒体上删除发布结果不会删除它。
Michael Rogers

除非您修改了代码,否则仅用于页面。您看到了,对吧,@ MichaelRogers?
tfrommen '17

不好意思了!
迈克尔·罗杰斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.