3

我遇到了一个独特的场景,我有一个 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_img实际上是ID。

那么问题出在哪里?

问题是,只有当所选择的图像大小是完整的图像大小时,此代码才能完美地工作。每当 URL 具有中间图像大小时(例如 - 图像名称,因此 URL 具有像 ImageName -123x4500 .jpg 这样的后缀大小) - 上述函数将返回0

大多数与 wordpress 附件相关的功能(如get_intermediate_size(),get_attachment_url()或许多其他功能)都需要ID作为参数。但我在此功能阶段没有 ID。

我什至尝试了一个名为的未知函数 url_to_postid( $url )——它也失败了。

我知道理论上我可以从表单中删除所有其他尺寸,但这是一种“hack”——不是解决方案——尤其是当我们在一个可能需要与其他插件共存的插件中时。

那么,如何根据具有未知 ID 的“自定义”图像 URL 获取(“完整”图像的)ID,该 URL 在那一刻也未附加(不发布,页面)?

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

编辑我

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

编辑二更新一-

我找到了一个 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();
};

这段代码实际上是从上传表单(其中包含 ID)中获取一个 CLASS 名称,并使用正确的 ID 而不是 URL 填充输入字段。

这充其量是“骇人听闻的”——而不是适用于所有情况的解决方案。但在我的具体情况下 - 它有效。

现在 - 有趣的事实是,如果表单中的这个 CLASS 名称包含 ID - 必须有一种方法来获取它。它在那里存在——因此必须有一些东西(钩子/过滤器/变量)让我抓住——但是什么和在哪里——我不知道,而且仍然没有找到。

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

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

如果有人有答案 - 请张贴。我不敢相信没有办法得到它(尤其是当它存在于诸如 class-postID 之类的表单代码上时 :-)

更新二 -

@biziclop 解决方案效果很好。我错过了一个简单的事实,即我的表没有默认重命名 - 因此在使用他的代码“原样”时返回 NULL 数组。(这和试图在没有调试模式的情况下取得进展的愚蠢想法:-))

再次感谢!

所有上述(和以下)解决方案都可以工作。

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

4

1 回答 1

3

附件存储在wp_postswp_postmeta表中。

wp_posts.guid似乎在其上传位置包含原始文件名

wp_postmeta(其中meta_key= "_wp_attachment_metadata")包含一个序列化的(http://php.net/manual/en/function.serialize.php)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-90x67.jpg";s:5:"宽度";s:2:"90"; s:6:"高度";s:2:"67";}s:6:"中等";a:3:{s:4:"文件";s:35:"IMG_2543-e1291981569982-180x135.jpg ";s:5:"宽度";s:3:"180";s:6:"高度";s:3:"135";}s:5:"大";a:3:{s: 4:“文件”;s:35:“IMG_2543-e1291981569982-500x375.jpg”;s:5:“宽度”;s:3:“500”;s:6:“高度”;s:3:“375 ";}}s:10:"image_meta";a:10:{s:8:"光圈";s:1:"0";s:6:"credit";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:"";}}"0";s:5:"标题";s:0:"";}}"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/

于 2012-06-12T08:01:38.107 回答