代码之家  ›  专栏  ›  技术社区  ›  Daniel Vickers

WordPress删除所有未在任何其他页面上使用的帖子附件

  •  0
  • Daniel Vickers  · 技术社区  · 4 年前

    我到处找了一遍,找不到任何与我的查询相关的代码。

    我本质上想以编程方式删除图像,然而,我的问题是,这些帖子上使用的一些图像已经在其他帖子上使用过,自然删除它们会破坏这些图像。

    我在一个 foreach 循环 get_posts() 下面的代码是我所拥有的全部,它删除了帖子的附加特色图片,我想从答案中得到的是:

    1. 删除所有通过ACF图像字段或特色图像连接的介质
    2. 但只有在其他帖子的附件列表中没有这些图片的情况下才能删除这些图片

    根据我所读到的内容,解决方案可能位于SQL查询中,后面跟着一个计数?但不幸的是,我对SQL几乎没有经验来创建一个有效的答案。

        if( has_post_thumbnail( $event->ID ) ) {
            $attachment_id = get_post_thumbnail_id( $event->ID );
    
            wp_delete_attachment($attachment_id, true);
        }
    

    到目前为止,我已经设法将我找到的一些代码用于MySQL查询,但我添加的其中两个部分似乎会使MySQL服务器崩溃。。。

    返回ID的工作代码:

    SELECT i.ID FROM wp_posts i 
    WHERE i.post_type = 'attachment'
    AND i.ID = '10038' 
    AND i.post_parent > 0 
    AND EXISTS (SELECT * FROM wp_posts p WHERE p.ID = i.post_parent)
    AND NOT EXISTS (SELECT * FROM wp_postmeta pm WHERE pm.meta_key = '_product_image_gallery' AND pm.meta_value LIKE CONCAT('%', i.ID ,'%'))
    AND EXISTS (SELECT * FROM wp_postmeta pm WHERE pm.meta_key = '_thumbnail_id' AND pm.meta_value = i.ID)
    

    导致服务器崩溃的损坏代码:

    AND NOT EXISTS (SELECT * FROM wp_posts p WHERE p.post_type <> 'attachment' AND p.post_content LIKE CONCAT('%', i.guid,'%'))
    AND NOT EXISTS (SELECT * FROM wp_postmeta pm WHERE pm.meta_value LIKE CONCAT('%', i.guid,'%'))
    

    我相信,如果我能确保损坏的代码行得到修复,我将能够使代码正常工作。

    1 回复  |  直到 4 年前
        1
  •  0
  •   IT goldman    4 年前

    您可以查看媒体库,然后从下拉列表中选择所有未附加的图像。

    Media Library Unattached