我遇到了一个退出的独特场景,我有一个IMAGE网址,但没有未附加的附件的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。
问题出在哪里?
问题是只有当所选图像大小为FULL图像大小时,此代码才能完美运行。 每当URL具有中间图像大小时(例如 - 图像名称,因此URL具有类似ImageName -123x4500 .jpg的冲浪大小) - 上述函数将返回 0
大多数与wordpress附件相关的功能(如get_intermediate_size()
或get_attachment_url()
或许多其他功能)都需要 ID 作为参数。但是我在这个功能阶段没有ID。
我甚至尝试过一个名为url_to_postid( $url )
的未知函数 - 它也失败了。
我知道理论上我可以从表单中删除所有其他大小,但这是一个“黑客” - 不是解决方案 - 特别是当我们在一个可能需要与其他插件共存的插件中时。
那么如何根据具有未知ID的“自定义”图片网址获取ID(“完整”图片),该网址在当时也是未附加的(不是发布,页面)?
(请注意,所有涉及post对象或自定义查询(不是直接sql)的解决方案都可能会失败,因为此时 - 图像没有附加到任何内容 - 即使已上传。)
编辑我
(注2 - 对URL进行所有字符串操作,如修剪/正则表达式等,如果我依赖于分辨率部分(例如300x300),将会非常危险 - 我永远不知道它会是什么,4digitx4digit, 3x4等..如果我依赖“ - ”字符,则没有保证它不会出现在图像名称本身中。)
编辑II更新I -
我发现了一个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();
};
此代码的作用实际上是从上传表单中获取CLASS名称(其中包含ID),并使用正确的ID而不是URL填充输入字段。
这至多是“hackish” - 而不是适用于所有情况的解决方案。但在我的具体情况下 - 它有效。
现在 - 有趣的事实是,如果表单中的CLASS名称包含ID - 必须有一种方法来获取它。它存在于那里 - 因此我必须抓住一些东西(一个钩子/过滤器/变量) - 但是什么和哪里 - 我不知道,但仍然没有找到。
@biziclop建议似乎的解决方案是 一个正确的< - strike>但由于某种原因它不适用于我的代码。也许必须在那里改变一些小事。 (见更新II)
有人建议使用backup_sizes
而不是_wp_attachment_metadata
使用相同的方法 - 但仍然是nada 。
如果有人有答案 - 请发帖。我无法相信没有办法得到它(特别是当它在类似postID的表单代码上存在时: - )
更新II -
@biziclop 解决方案效果很好。 我错过了一个简单的事实,即我的表没有默认的重命名 - 因此当使用他的代码“as-is”时返回NULL数组。 (那个以及在没有DEBUG模式的情况下尝试进步的愚蠢想法:-))
再次感谢!
所有上述(及以下)解决方案都可行。
我仍然感到好奇的是上传表格中的上述类别。如果使用正确的ID(类ID)生成它们,则必须有一种方法可以使用简单的钩子/过滤器来获取它们。但我想这将是以后的时间。
答案 0 :(得分:3)
附件存储在wp_posts
和wp_postmeta
表中。
wp_posts.guid
似乎在其上传位置包含原始文件名
wp_postmeta
(其中meta_key
= "_wp_attachment_metadata"
)包含一个序列化的(http://php.net/manual/en/function.serialize.php)PHP数组,其中包含已调整大小的文件名以及其他内容:
一个:6:{S:5: “宽度”; S:4: “1000”; S:6: “高度”; S:3: “750”; S:14: “hwstring_small”; S: 23:“height ='96'width ='128'”; s:4:“file”; s:35:“2010/12 / IMG_2543-e1291981569982.jpg”; s:5:“sizes”; a:3 :{S:9: “缩略图”;一个:3:{S:4: “文件”,S:33: “IMG_2543-e1291981569982-90x67.jpg”; S:5: “宽度”,S:2:” 90 “; S:6:” 高度 “; S:2:” 67 “;} S:6:” 中等 “;一个:3:{S:4:” 文件 “S:35:” IMG_2543-e1291981569982- 180x135.jpg “; S:5:” 宽度 “S:3:” 180 “; S:6:” 高度 “; S:3:” 135 “;} S:5:” 大“;一个:3: {S:4: “文件”,S:35: “IMG_2543-e1291981569982-500x375.jpg”; S:5: “宽度”,S:3: “500”; S:6: “高度”; S:3 : “375”;}} S:10: “image_meta”;一个:10:{S:8: “孔”; S:1: “0”; S:6: “信用”; S:0: “” ; S:6: “照相机”; S:0: “”; S:7: “标题”; S:0: “”; S:17: “created_timestamp”; S:1: “0”; S:9 : “版权”; S:0: “”; S:12: “FOCAL_LENGTH”; S:1: “0”; S:3: “ISO”; S:1: “0”; S:13:“shutter_speed “; S:1:” 0 “; S:5:” 标题 “S:0:”“;}}
WordPress /您可以通过调整大小的文件名查找post_id
的唯一方法如下:
•使用MySQL LIKE
进行预过滤潜在匹配(将是sloooow):
SELECT wp_posts.ID, wp_postmeta.meta_value
FROM wp_posts
INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
AND wp_postmeta.meta_key = '_wp_attachment_metadata'
AND wp_postmeta.meta_value LIKE '%"IMG_2345-100x100.jpg"%'
•通过反序列化(使用http://codex.wordpress.org/Function_Reference/maybe_unserialize?)每个meta_value来验证/缩小PHP中的搜索结果,并手动检查它是否真的与文件名匹配。
function thumbnail_url_to_id( $file_url ){
global $wpdb;
$filename = basename( $file_url );
$rows = $wpdb->get_results( $wpdb->prepare("
SELECT wp_posts.ID, wp_postmeta.meta_value
FROM wp_posts
INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
AND wp_postmeta.meta_key = '_wp_attachment_metadata'
AND wp_postmeta.meta_value LIKE %s
",'%"'.like_escape($filename).'"%'
));
foreach( $rows as $row ){
$row -> meta_value = maybe_unserialize( $row -> meta_value );
//tr( $row );
var_dump( $row );
}
}
$files = explode("\n",
'TEST_123-90x67.jpg
TEST_123-90x671.jpg
TEST_123-180x134.jpg
TEST_123-180x1341-90x67.jpg
TEST_123-180x1341.jpg
TEST_123-500x373.jpg
TEST_123-500x3731-90x67.jpg
TEST_123-500x3731-180x134.jpg
TEST_123-500x3731.jpg
TEST_123.jpg
TEST_1231-90x67.jpg
TEST_1231-180x134.jpg
TEST_1231-500x373.jpg
TEST_1231.jpg');
$upload_base = 'http://cc/wordpress/wp-content/uploads/2012/06/';
foreach( $files as $filename ){
thumbnail_url_to_id( $upload_base.$filename );
}