wordpress - 独特方案 - 通过URL获取附件ID

时间:2012-06-12 05:07:11

标签: php wordpress attachment

我遇到了一个退出的独特场景,我有一个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)生成它们,则必须有一种方法可以使用简单的钩子/过滤器来获取它们。但我想这将是以后的时间。

1 个答案:

答案 0 :(得分:3)

附件存储在wp_postswp_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 );
}

测试结果:http://jsfiddle.net/PcjKA/