首页 文章

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

提问于
浏览
3

我遇到了一个退出的独特场景,我有一个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的“自定义”图像URL获取ID(“FULL”图像),该ID在当时也是未附加的(不是发布,页面)?

(请注意,涉及post对象或自定义查询(不是直接sql)的所有解决方案都可能会失败,因为此时 - 图像不会附加到任何内容 - 即使已上载 . )

EDIT I

(注意2 - 对URL进行所有字符串操作,如修剪/正则表达式等,如果我依赖于分辨率部分(例如300x300),将会非常危险 - 我永远无法知道它将是什么,4digitx4digit,3x4等 . 如果我依赖“ - ”字符,则没有保证它不会出现在图像名称本身中 . )

EDIT II UPDATE 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 - 必须有一种方法来获取它 . 它存在于那里 - 因此我必须 grab 一些东西(一个钩子/过滤器/变量) - 但是什么和哪里 - 我不知道,但仍然没有发现 .

@biziclop建议的解决方案似乎是正确的 - 但由于某种原因,它不适用于我的代码 . 也许必须在那里改变一些小东西 . (见更新II)

有人建议使用 backup_sizes 而不是 _wp_attachment_metadata 采用相同的方法 - 但仍然是虚无...

如果有人有答案 - 请发布 . 我无法相信没有办法得到它(特别是当它在类似postID的表单代码上存在时:-)

UPDATE II -

@biziclop 解决方案运行良好 . 我错过了一个简单的事实,即我的表没有默认重命名 - 因此在使用他的代码"as-is"时返回NULL数组 . (这和在没有DEBUG模式的情况下尝试进步的愚蠢想法:-))

再次感谢!

所有上述(及以下)解决方案都可行 .

我仍然很好奇的一件事是上传表格中的上述类 . 如果使用正确的ID(类ID)生成它们,则必须有一种方法可以使用简单的钩子/过滤器来获取它们 . 但我想这将是以后的时间 .

1 回答

  • 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:”高度= '96'宽度= '128' “; S:4:” 文件 “S:35:” 2010/12 / IMG_2543-e1291981569982.jpg “; S:5:” 大小 “;一个: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”;}}Š :10: “image_meta”;一个:10:{S:8: “孔”; S:1: “0”; S:6: “信用”; S:0: “”; S:6: “照相机” ; S:0: “”; S:7: “ Headers ”; 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:” Headers “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/

相关问题