使用MEDIA_SIDELOAD_IMAGE()上载前检查图像是否存在

时间:2017-03-30 作者:Johansson

我正在开发一个主题,该主题将在发布帖子时抓取并上传图像,使用以下功能:

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查询不够熟练。如果这也是一种选择,我们将不胜感激。

UPDATE

我使用此查询查看文件是否存在。使用这个安全吗?它是否总是返回正确的值?

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

2 个回复
最合适的回答,由SO网友:birgire 整理而成

我想知道你是否在寻找核心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.

Update:

现在我更明白你的意思了。问题是_wp_attached_file 存储值,如2015/04/test.jpg, 如果您使用年/月上载,那么您可以尝试搜索test.jpg 使用文件

... WHERE meta_key = \'_wp_attached_file\' AND meta_value LIKE \'%/test.jpg\' 
在自定义代码段中(注意代码中可能存在的SQL注入)。

不确定您的设置是什么,但另一种方法可能是以更适合您需要的方式在db中存储成功获取和上载的图像。

SO网友:Johansson

我接受了@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。

我必须提到,为了实现这一点,我需要禁用上传媒体的年/月组织。