web-dev-qa-db-ja.com

アップグレードフォルダから画像を削除するが、メディアライブラリからは削除しない

私はユーザーが.zipファイルをアップロードすることを可能にするプラグインを書きました、そしてそのファイルがすでにuploadsフォルダーにあるならば、それは内容を消去し、そこに新しいZipファイルをアップロードし、そしてそれを解凍します。

プラグインは動作しますが、ファイルをアップロードするたびに、アップロードフォルダから削除されてもメディアライブラリに残っていることに気付きました。そのため、uploadsフォルダは空になる可能性がありますが、それでもメディアライブラリに表示されています。これがファイルを置き換える私のコードです。

 //first, check if there's an existing directory
      if (file_exists($upload_dir . "PDF-archive")){
          //if the directory exists, delete all the files inside
            $file_names = glob($upload_dir . "PDF-archive/*");
            foreach ($file_names as $files){
              if (is_file($files)){
                unlink($files);
                }
              }
          }
      else {
       //if directory doesn't exist, create a new one
         $pdf_archive_dir = $temp['basedir'];
         $pdf_archive_dir = $pdf_archive_dir . '/PDF-archive';
         wp_mkdir_p($pdf_archive_dir);
       }
      //directory is created and empty, now add files and unzip them
      rename($uploaded_file_path, $new_file_path); //move Zip files into new directory
      unzip_zips($uploaded_file_name); //unzips the uploaded file
      }

私はメディアライブラリがデータベースに保存すると仮定しています...それがそこから同様に削除されることを確実にする方法があるでしょうか?私が言ったようにそれはうまくいくが、クライアントは毎日新しいZipファイルを追加しようとしているので、それらがuploadsフォルダに存在しなくても、メディアライブラリに50以上のエントリを持たないようにしたい。

傍注:私はこれについてはかなり新しいので、あなたが私のコードに問題があるのを見つけたら、私はフィードバックをいただければと思います。ありがとうございます。

2
Coltvant

Wordpressはメディアライブラリを_postsテーブルに保存します - メディアライブラリの項目にはattachmentpost_typeが表示されます。行のguid値に気付くでしょう。これはメディアアイテムのデフォルトURLです。

unlink()があなたのファイルを作っている間、あなたはファイルの完全なURLを作ることができます。それから、その完全なURLを$wpdbを示す単純なデータベースクエリ( WHERE guid = '$thefullURL' )で使用します。これで行が返され、メディアライブラリアイテムのIDを取得できるようになります。

IDを取得したら、Wordpressの wp_delete_post() で削除することができます(これはライブラリから削除され、_postmetaという用語も使用されます)

3
David Sword