web-dev-qa-db-de.com

Überprüfe, ob ein Bild existiert, bevor du es mit media_sideload_image () hochlädst

Ich entwickle ein Thema, das ein Bild mit der folgenden Funktion aufnimmt und hochlädt, wenn ein Beitrag veröffentlicht wird:

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

Das Problem ist, dass ich meine Posts oft aktualisiere und dies zu Dutzenden Kopien desselben Bildes führt, die bei jedem Post-Update mehrmals hochgeladen wurden.

Kann ich überprüfen, ob ein Anhang vorhanden ist, bevor ich ihn auf den Server hochlade?

P.S: Im Moment benutze ich diese Funktion, um die ID des hochgeladenen Anhangs zu erhalten:

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

Da ich Zugriff auf den Dateinamen habe, den ich suche (von der URL) und alle eindeutig sind (Dateinamen sind in Hash), könnte ich überprüfen, ob er in der Datenbank vorhanden ist, aber ich bin nicht gut genug mit SQL-Abfragen. Wenn dies auch eine Option ist, wird jede Hilfe geschätzt.

UPDATE

Ich benutze diese Abfrage, um zu sehen, ob die Datei existiert oder nicht. Ist es sicher, dies zu benutzen? Gibt es immer den richtigen Wert zurück?

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

Ich frage mich, ob Sie nach der Kernfunktion attachment_url_to_postid() suchen, die Folgendes verwendet:

$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 );

Beachten Sie die zusätzliche Überprüfung des Metaschlüssels _wp_attached_file im Vergleich zu Ihrem aktuellen Snippet.

Wenn Sie überprüfen müssen, ob es sich bei einer Bild-URL um eine vorhandene Miniaturansicht handelt, können Sie meine aktuelle Antwort überprüfen hier .

Update:

Jetzt verstehe ich es besser, was du meinst. Das Problem ist, dass _wp_attached_file Werte wie 2015/04/test.jpg speichert, wenn Sie Jahr/Monat-Uploads verwenden, sodass Sie versuchen können, nach der test.jpg-Datei mit zu suchen

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

in Ihrem benutzerdefinierten Snippet (achten Sie auf mögliche SQL-Injections in Ihrem Code).

Sie sind sich nicht sicher, wie Sie vorgehen sollen, aber ein anderer Ansatz könnte darin bestehen, erfolgreich abgerufene und hochgeladene Bilder besser in der Datenbank zu speichern, die Ihren Anforderungen entspricht.

2
birgire

Ich akzeptierte die Antwort von @ birgire, löste sie jedoch, indem ich mich dem Problem folgendermaßen näherte:

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

Diese Funktion verwendet eine Bild-URL und prüft, ob das Medium bereits hochgeladen ist. Wenn nicht, wird media_sideload_image() zum Hochladen verwendet und die ID des hochgeladenen Anhangs zurückgegeben.

Ich muss erwähnen, dass ich Jahr/Monat Organisation der hochgeladenen Medien deaktivieren musste, um dies zu erreichen.

2
Jack Johansson