web-dev-qa-db-fra.com

Vérifiez si l'image existe avant de télécharger avec media_sideload_image ()

Je développe un thème qui permettra de récupérer et de télécharger une image lors de la publication d'un article, à l'aide de la fonction suivante:

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

Le problème, c’est que je mets souvent à jour mes publications, ce qui aboutit à des dizaines de copies de la même image, qui ont été téléchargées plusieurs fois à chaque mise à jour.

Existe-t-il un moyen de vérifier si une pièce jointe existe avant de la télécharger sur le serveur?

P.S: Pour le moment, j'utilise cette fonction pour obtenir l'ID de la pièce jointe téléchargée:

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

Depuis que j'ai accès au nom de fichier que je récupère (depuis l'URL) et qu'ils sont tous uniques (les noms de fichiers sont en hachage), je pourrais vérifier son existence dans la base de données mais je ne suis pas assez bon avec les requêtes SQL. Si cela est également une option, toute aide est la bienvenue.

METTRE À JOUR

J'utilise cette requête pour voir si le fichier existe ou non. Est-ce sécuritaire d'utiliser cela? retournera-t-il toujours la bonne valeur?

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

Je me demande si vous recherchez la fonction de base attachment_url_to_postid() qui utilise:

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

Notez la vérification supplémentaire de la clé méta _wp_attached_file par rapport à votre extrait de code actuel.

Si vous devez vérifier si une URL d'image est une miniature existante, vous pouvez vérifier ma réponse récente ici .

Mise à jour:

Maintenant, je comprends mieux ce que vous voulez dire. Le problème est que _wp_attached_file stocke des valeurs telles que 2015/04/test.jpg, si vous utilisez des téléchargements année/mois, vous pouvez donc essayer de rechercher le fichier test.jpg avec

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

dans votre extrait personnalisé (faites attention aux éventuelles injections SQL dans votre code).

Vous ne savez pas quelle est votre configuration, mais une autre approche pourrait consister à stocker avec succès les images extraites et téléchargées de manière plus appropriée dans la base de données qui correspond à vos besoins.

2
birgire

J'ai accepté la réponse de @ birgire, mais je l'ai résolue en abordant le problème de la manière suivante:

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

Cette fonction prend une URL d'image et vérifie si le média est déjà téléchargé. Sinon, utilise media_sideload_image() pour le télécharger et renvoie l'ID de la pièce jointe téléchargée.

Je dois mentionner que je devais désactiver l’organisation annuelle/mensuelle des médias téléchargés pour atteindre cet objectif.

2
Jack Johansson