Php wordpress-唯一场景-通过URL获取附件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'] ; //

我遇到了一个独特的退出场景,其中我有一个图像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\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 );
}