问题描述

我刚从 MediaTemple 导出了一个很大的 WP 博客到 PHPFog 。

我使用标准的 WordPress 导出和导入插件。

由于一些未知的原因,我的所有媒体资产都被重复。我现在每个帖子的图像数量是两倍。

如果一个原始文件被称为”Lot-44-Warrens.jpg” 它现在有一个重复名为”Lot-44-Warrens1.jpg” 这两个文件都附加到同一个文章。

我现在有大约 250 多个帖子中有很多重复的图片。

所以我的问题是如何从媒体库和帖子中删除所述重复的内容?

我试图用”*1.jpg” 搜索媒体库,但它没有工作。

寻找一个整洁的解决方案,并不意味着手动删除每个 dupe 。

也许有一个 MySQL 查询我可以运行从 Library 和帖子中删除重复?

该网站是:http://igrealty.phpfogapp.com/

最佳解决方法

结合这个页面上的两个答案,我发现这是有效的。

$args = new WP_Query(array(
  'post_type' => 'post',
  'posts_per_page' => -1
));

$loop = new WP_Query($args);

while($loop->have_posts()) {
  the_post();
  $args2 = array(
    'order' => 'ASC',
    'post_type' => 'attachment',
    'post_parent' => $post->ID,
    'post_mime_type' => 'image');
    $attachments = get_posts($args2);
    if($attachments) {
      foreach ($attachments as $img_post) {
        if( ((strpos($img_post->guid, '1.jpg')!== false) || (strpos($img_post->guid, '1.gif')!== false) || (strpos($img_post->guid, '1.png')!== false))){
          $stuff = $img_post->guid;
          wp_delete_attachment($img_post->ID);
        }
      }
    }
} wp_reset_postdata();

次佳解决方法

使用 run-once 脚本进行清理。只是一个大纲,没有代码:

  1. 获取所有帖子参见 get_posts( array ( 'numberposts' => -1 ) )

  2. 为每个帖子获取所有附件。参见 get_children( array ( 'post_type' => 'attachment', 'numberposts' => -1 ) )

  3. 每个附件获取附件 URL 。参见 wp_get_attachment_url()

  4. 如果您在父帖子的内容 ($post->post_content) 中找到附件网址:

    • 如果有另一个具有相同文件名的附件 URL 加上 1

    • 两者都是帖子内容的一部分

    • 先删除第二张图片

    • 使用 wp_delete_attachment()删除物理文件。这将删除其他帖子中的所有元数据和所有关联。这是删除附件文件 (imho) 的最佳方法。

可能还要等一下。在您的网站的本地副本上测试。也许你应该以 50 个帖子 ('numberposts' => 50) 的步骤运行该过程。

第三种解决方法

该脚本将抓取数据库中的所有附件,通过 md5 将文件彼此进行比较,如果它找到重复文件,并且在文件名末尾有一个,它将删除该图像:

require('wp-load.php');

global $wpdb;

$img_posts = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}posts WHERE post_type like 'attachment'");

$img_md5s = array();

foreach($img_posts as $img_post){
  $single_img_md5 = md5_file($img_post->guid);

  if(in_array($single_img_md5, $img_md5s) && ((strpos($img_post->guid, '1.jpg')!== false) || (strpos($img_post->guid, '1.gif')!== false) || (strpos($img_post->guid, '1.png')!== false))){
    wp_delete_attachment($img_post->ID);

  }else{
    $img_md5s[] = $single_img_md5;
  }
}

只需将其放在根目录中的文件中即可。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。