web-dev-qa-db-ja.com

Media_sideload_image()でアップロードする前に画像が存在するか確認してください

私は以下の機能を使用して、投稿が公開されたときに画像を取得してアップロードするテーマを開発しています。

media_sideload_img( $url, $id, $description, 'src' );

問題は、私は頻繁に私の投稿を更新し、これは毎回更新されるたびに数回アップロードされた同じ画像の何十ものコピーで終わることです。

添付ファイルをサーバーにアップロードする前にそれが存在するかどうかを確認する方法はありますか?

P.S: 現時点では、アップロードされた添付ファイルのIDを取得するためにこの機能を使用しています。

function get_attachment_id_from_src ($image_src) {
    global $wpdb;
    $query = "SELECT ID FROM {$wpdb->posts} WHERE guid='$image_src'";
    $id = $wpdb->get_var($query);
    return $id;
}

私は(URLから)取得しているファイル名にアクセスでき、それらはすべて一意です(ファイル名はハッシュになっています)ので、データベースに存在するかどうかをチェックできますが、SQLクエリでは十分ではありません。これも選択肢であるならば、どんな助けでも評価されます。

_アップデート_

ファイルが存在するかどうかを確認するためにこのクエリを使用しています。これを使用しても安全ですか?それは常に正しい値を返しますか?

$wpdb->get_var("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_value = '$img_name'");
3
Jack Johansson

あなたが中心となる attachment_url_to_postid() 関数を探しているのでしょうか。

$sql = $wpdb->prepare(
    "SELECT post_id FROM $wpdb->postmeta 
         WHERE meta_key = '_wp_attached_file' AND meta_value = %s",
    $path
);
$post_id = $wpdb->get_var( $sql );

現在のスニペットと比較して、追加のメタキー_wp_attached_fileチェックを確認してください。

画像のURLが既存のサムネイルかどうかを確認する必要がある場合は、最近の回答 here を確認してください。

更新:

今、私はそれがあなたが何を意味しているのかより良く理解しています。問題は、年/月のアップロードを使用する場合、_wp_attached_file2015/04/test.jpgのような値を格納するため、test.jpgファイルを検索するには、

... WHERE meta_key = '_wp_attached_file' AND meta_value LIKE '%/test.jpg' 

あなたのカスタムスニペットの中で(あなたのコードで可能なSQLインジェクションに気をつけろ)。

あなたの設定が何であるかはわかりませんが、もう一つのアプローチはあなたのニーズに合ったdbの中でより適切な方法でうまく取り出されてアップロードされた画像を保存することかもしれません。

2
birgire

私は@ birgireの回答を受け入れましたが、私はこのようにして問題に取り組むことでそれを解決しました:

function upload_image_as_attachment ($image_url, $post_id, $title) {
    $img_name = basename ($image_url);
    $local_url = wp_get_upload_dir()['path'].'/'.$img_name;
    if(file_exists($local_url)){
        $id = attachment_url_to_postid($local_url);
        return $id;
    } else {
        $attachment_src = media_sideload_image( $image_url, $post_id, $title,'src' );
        $id = attachment_url_to_postid($attachment_src);
        return $id;
    }
}

この関数は画像のURLを取得し、メディアがすでにアップロードされているかどうかを確認します。そうでない場合は、media_sideload_image()を使用してアップロードし、アップロードされた添付ファイルのIDを返します。

私はこれを達成するためにアップロードされたメディアの年/月編成を無効にする必要があることに言及しなければなりません。

2
Jack Johansson