web-dev-qa-db-ja.com

投稿やメディアライブラリから重複した画像を見つけて削除する正しい方法は何ですか?

先ほどのWPブログをMediaTempleからPHPFogにエクスポートしました。

私は標準のWordPressのエクスポートとインポートのプラグインを使いました。

何らかの理由で私のメディア資産はすべて複製されました。私は今ポストあたり2倍多くの画像を持っています。

元のファイルが "Lot-44-Warrens.jpg"と呼ばれていた場合、それは "Lot-44-Warrens1.jpg"と呼ばれる重複を持ちます。両方のファイルは同じ投稿に添付されています。

私は今約250以上の投稿にまたがってたくさんの重複画像を持っています。

それで私の質問は私がどのように私がメディアライブラリーからそして投稿から言われた重複を取り除くのですか?

メディアライブラリを "* 1.jpg"で検索しようとしましたが、うまくいきませんでした。

手動で各重複を削除するという意味ではありませんきちんとした解決策を探しています。

おそらく、ライブラリと投稿から重複を削除するために実行できるMySQLクエリがありますか?

問題のサイトは次のとおりです。 http://igrealty.phpfogapp.com/ /。

6
jnthnclrk

このページの2つの答えを組み合わせると、これでうまくいくことがわかりました。

$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();
2
UzumakiDev

それをクリーンアップするために1回実行スクリプトを使用してください。概要だけでコードはありません。

  1. すべての投稿を入手 get_posts( array ( 'numberposts' => -1 ) ) を参照してください。
  2. 投稿ごとにすべての添付ファイルを入手してください。 get_children( array ( 'post_type' => 'attachment', 'numberposts' => -1 ) ) を参照してください。
  3. 添付ファイルごとに添付ファイルのURLを取得します。 wp_get_attachment_url() を参照してください。
  4. 親投稿のコンテンツに添付ファイルのURLがある場合($post->post_content):
    • 同じファイル名と1を含む別の添付ファイルURLがある場合
    • どちらも投稿コンテンツの一部です
    • 次に2番目の画像を削除してから
    • wp_delete_attachment() を使用して物理ファイルを削除します。これにより、すべてのメタデータと他の投稿内のすべての関連付けも削除されます。添付ファイルを削除するのが最善の方法です(imho)。

これは時間がかかる場合があります。サイトのローカルコピーでテストしてください。たぶんあなたは50ポストのステップでプロセスを実行するべきです('numberposts' => 50)。

4
fuxia

このスクリプトは、データベース内のすべての添付ファイルを取得し、md5を使用してファイルを相互に比較し、重複が見つかり、ファイル名の末尾に1がある場合、イメージを削除します。

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;
  }
} 

ルートディレクトリのファイルに配置するだけです。

3
Lee

アプリケーションがデータベースからアセットを見つけたり削除したりするための適切な機能を提供していない場合、私は昨日は貴重な教訓を学びません。複雑なMySQLクエリを作成する。それなら最善の策は基本に戻ることです。

最後に、私はテーブルを複製してExcelにエクスポートし、重要なフィールドの私自身の "ハッシュ"を作成することによってそれらをフィルタリングし(MySQLでこれを行うことは複雑でサーバーを数回クラッシュさせた)削除したいと確信していたIDのリスト。私はそれからIDで各行を削除するためにはるかに単純なMySQLクエリを構築しました。

私はゆっくりと物事を進め、私が適用した各Excelフィルタを検討することができたので、この方法はとてもうまくいきました。このようにして、正しいレコードを削除していると確信しました。私はExcelで正確に自分が削除したものの正確な記録も持っています。

0
jnthnclrk