我遇到了一个独特的场景,我有一个 IMAGE url,但没有一个未附加附件的 ID(我知道这听起来很奇怪 - 但在 wordpress 术语中它是正确的 :-) )。
我正在插件中使用 wordpress 附件上传表单,用户可以在其中上传图片。然后,他单击填充 $options 字段的“插入帖子”按钮。(标准程序)
然后我需要该图像的 ID。问题是 wordpress 的大部分功能都需要一个 ID 才能工作。
我可以使用如下代码检索该图像的 ID:
$image_src = $options['upload_image'] ; // the options field in the plugin that holds the image URL
$postid_img = $wpdb->get_var(
"SELECT ID FROM $wpdb->posts
WHERE guid = '$image_src'
AND post_type='attachment' LIMIT 1");
现在$postid_img
实际上是ID。
那么问题出在哪里?
问题是,只有当所选择的图像大小是完整的图像大小时,此代码才能完美地工作。每当 URL 具有中间图像大小时(例如 - 图像名称,因此 URL 具有像 ImageName -123x4500 .jpg 这样的后缀大小) - 上述函数将返回0。
大多数与 wordpress 附件相关的功能(如get_intermediate_size()
,get_attachment_url()
或许多其他功能)都需要ID作为参数。但我在此功能阶段没有 ID。
我什至尝试了一个名为的未知函数 url_to_postid( $url )
——它也失败了。
我知道理论上我可以从表单中删除所有其他尺寸,但这是一种“hack”——不是解决方案——尤其是当我们在一个可能需要与其他插件共存的插件中时。
那么,如何根据具有未知 ID 的“自定义”图像 URL 获取(“完整”图像的)ID,该 URL 在那一刻也未附加(不发布,页面)?
(请注意,所有涉及 post 对象或自定义查询(不是直接 sql)的解决方案都可能会失败,因为此时 - 图像未附加到任何内容 - 即使已上传。)
编辑我
(注 2 - URL 上的所有字符串操作,如修剪/正则表达式等,都太危险了。如果我依赖分辨率部分(例如 300x300) - 我永远不知道它会是什么,4digitx4digit,3x4 等。 .如果我依赖“-”字符,则没有保证它不会出现在图像名称本身中。)
编辑二更新一-
我找到了一个 Hack 来“解决”这个问题。我写“解决”是因为它适用于我的特定情况,但并非在所有情况下都有效。(感谢 #wordpress IRC 上的 kovshenin 让我朝着正确的方向前进)
我更改了更新输入字段的 jQuery 代码:
window.send_to_editor = function(html) {
imgurl = jQuery('img',html).attr('src');
jQuery('#upload_image').val(imgurl);
tb_remove();
}
到 :
window.send_to_editor = function(html) {
var attachment_id = 0;
var classes = jQuery('img',html).attr('class').match(/wp\-image\-([0-9]+)/); // regex to "hijack" the class name (which is the ID)
if ( classes[1] )
attachment_id = classes[1];
imgurl = jQuery('img',html).attr('src');
jQuery('#upload_image').val(attachment_id); // assign att id.
tb_remove();
};
这段代码实际上是从上传表单(其中包含 ID)中获取一个 CLASS 名称,并使用正确的 ID 而不是 URL 填充输入字段。
这充其量是“骇人听闻的”——而不是适用于所有情况的解决方案。但在我的具体情况下 - 它有效。
现在 - 有趣的事实是,如果表单中的这个 CLASS 名称包含 ID - 必须有一种方法来获取它。它在那里存在——因此必须有一些东西(钩子/过滤器/变量)让我抓住——但是什么和在哪里——我不知道,而且仍然没有找到。
@biziclop 建议的解决方案似乎是正确的 -但由于某种原因,它不适用于我的代码。也许有些小东西必须在那里改变。(见更新二)
有人建议使用backup_sizes
而不是_wp_attachment_metadata
使用相同的方法 -但仍然是 nada。
如果有人有答案 - 请张贴。我不敢相信没有办法得到它(尤其是当它存在于诸如 class-postID 之类的表单代码上时 :-)
更新二 -
@biziclop 解决方案效果很好。我错过了一个简单的事实,即我的表没有默认重命名 - 因此在使用他的代码“原样”时返回 NULL 数组。(这和试图在没有调试模式的情况下取得进展的愚蠢想法:-))
再次感谢!
所有上述(和以下)解决方案都可以工作。
我仍然好奇的一件事是上传表单中的上述类。如果它们是使用正确的 ID(类 ID)生成的,则必须有一种方法可以通过简单的钩子/过滤器来获取它们.. 但我想那将是以后的时间。