我正在开发一个主题,该主题将在发布帖子时抓取并上传图像,使用以下功能:
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\'");
最合适的回答,由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。
我必须提到,为了实现这一点,我需要禁用上传媒体的年/月组织。