Php wordpress-唯一场景-通过URL获取附件ID
我遇到了一个独特的退出场景,其中我有一个图像url,但没有未附加附件的ID(我知道这听起来很奇怪,但用wordpress术语来说是正确的:-) 我正在插件中使用wordpress附件上传表单,用户可以在其中上传图像。然后,他单击“插入帖子”按钮,该按钮填充$options字段。(标准程序) 然后我需要那个图像的ID。 问题是wordpress的大多数功能都需要ID才能工作 我可以使用如下代码检索该图像的ID:Php wordpress-唯一场景-通过URL获取附件ID,php,wordpress,attachment,Php,Wordpress,Attachment,我遇到了一个独特的退出场景,其中我有一个图像url,但没有未附加附件的ID(我知道这听起来很奇怪,但用wordpress术语来说是正确的:-) 我正在插件中使用wordpress附件上传表单,用户可以在其中上传图像。然后,他单击“插入帖子”按钮,该按钮填充$options字段。(标准程序) 然后我需要那个图像的ID。 问题是wordpress的大多数功能都需要ID才能工作 我可以使用如下代码检索该图像的ID: $image_src = $options['upload_image'] ; //
$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\u img
实际上就是ID
那么问题出在哪里呢
问题是,只有当选择的图像大小是完整图像大小时,此代码才能完美工作。
每当URL具有中间图像大小时(例如图像名称,因此URL具有固定大小,如ImageName-123x4500.jpg),上述函数将返回0
大多数与wordpress附件相关的函数(如get\u intermediate\u size()
,或get\u attachment\u url()
或许多其他函数)都需要ID作为参数。但是我在函数的这个阶段没有ID
我甚至尝试了一个名为url\u to\u posted($url)
的未知函数,但也失败了
我知道理论上我可以从表单中删除所有其他大小的插件,但这是一种“黑客行为”——而不是一种解决方案——特别是当我们在一个可能需要与其他插件共存的插件中时
那么,如何根据一个未知ID的“自定义”图像URL获取(完整图像的)ID,该URL在当时也是未附加的(不是发布,页面)
(请注意,所有涉及post对象或自定义查询(不是direct sql)的解决方案都可能会失败,因为此时,即使上传,图像也不会附加到任何内容。)
编辑I
(注意2-URL上的所有字符串操作,如修剪/正则表达式等,都将非常危险。如果我依赖分辨率部分(例如300x300)-我永远不知道它将是什么,4digitx4digit,3x4等。如果我依赖“-”字符,则无法保证它不会出现在图像名称本身中。)
编辑II更新I-
我找到了一个“解决”这个问题的方法。我写“resolve”是因为它适用于我的具体情况,但不是所有情况。(感谢wordpress IRC上的kovshenin为我指明了正确的方向)
我更改了的jQuery代码,该代码从以下位置更新输入字段:
window.send_to_editor = function(html) {
imgurl = jQuery('img',html).attr('src');
jQuery('#upload_image').val(imgurl);
tb_remove();
}
致:
这段代码实际上是从上传表单(其中包含ID)中获取一个类名,并用正确的ID而不是URL填充输入字段
这充其量只是“黑客式”的——并不是所有情况下的解决方案。但在我的特定场景中,它是有效的
现在,有趣的事实是,如果表单中的类名包含ID,那么一定有办法获取它。它存在于那里——因此,某些东西(一个钩子/过滤器/变量)必须在那里让我抓取——但是什么和在哪里——我不知道,而且仍然没有发现
@biziclop建议的解决方案似乎是正确的——但由于某些原因,它在我的代码中不起作用。也许那里有些小东西必须改变。(见更新二)
有人建议使用backup\u size
而不是\u wp\u attachment\u metadata
使用相同的方法-但仍然是nada
如果有人有答案,请发帖。我不敢相信没有办法得到它(特别是当它存在于像类postID:-)这样的表单代码中时)
更新II-
@biziclop解决方案运行良好。
我忽略了一个简单的事实,即我的表没有默认的重命名,因此在使用他的代码“原样”时返回空数组。(还有一个愚蠢的想法,就是在调试模式未打开的情况下继续进行:-))
再次感谢你
所有上述(及以下)解决方案都会奏效
我仍然好奇的一件事是上传表单中的上述类。如果它们是用正确的ID(类ID)生成的,那么必须有一种方法通过一个简单的钩子/过滤器获得它们。。但我想那将是以后的事。附件存储在
wp\u posts
和wp\u postETA
表中
wp_posts.guid
似乎在其上载位置包含原始文件名
wp\u postmeta
(其中meta\u key
=“\u wp\u attachment\u metadata”
)包含一个序列化的()PHP数组,其中包含调整大小的文件名以及其他内容:
a:6:{s:5:“宽度”s:4:“1000”s:6:“高度”s:3:“750”s:14:“hwstring_small”s:23:“高度='96'宽度='128'”;s:4:“文件”s:35:“2010/12/IMG_2543-e1291981569982.jpg”;s:5:“尺寸”a:3:{s:9:“缩略图”a:3:{s:4:“文件”s:33:“IMG_2543-e1291981569982-907.jpg”;s:5:“宽度”s:2:“s:6”;s:6:“中等高度”s:67:“文件”例如:5:“宽度”s:3:“宽度”s:3:“3”3:“500”s)s:6:“高度”s:3:“3:3:“3:“135”;})s:5:“大型”s:5:“大型”a:a:a:3:::。5::5::a:a:3:{3:{s:5:(s:s:4::4:4:“文件”s:s:s:s:3:s:s:s:s:s:s:s:s:s:3:3:3:3:3:3:3:3:3:3:3:,3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:3:以下以下以下以下以下以下以下以下以下以下以下以下s:1:0;s:9:版权所有;s:0:;s:12:“焦距”;s:1:“0”;s:3:“iso”;s:1:“0”;s:13:“快门速度”;s:1:“0”;s:5:“标题”;s:0:;}
WordPress/您可以通过调整大小的文件名查找post\u id
的唯一方法如下:
•使用MySQL像
一样预过滤潜在匹配项(将是slooow):
•通过取消序列化(使用?)每个meta_值,在PHP中验证/缩小搜索结果,并手动检查其是否与文件名匹配
第二部分。
测试结果:谢谢
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();
};
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"%'
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 );
}