使用media_sideload_Image()上传后获取$IMAGE_ID

时间:2012-03-21 作者:Xavin

我想上传一张图片,并将其设置为帖子中的特色图片。我尝试的是:

$image_id = media_sideload_image($image_url, $post_id, $post_id);
update_post_meta($post_id, \'_thumbnail_id\', $image_id);
但是media_sideload_image() 未返回image_id, 但是呈现html图像。我怎样才能得到image_id?

5 个回复
SO网友:Tom J Nowell

下面是一个如何使用操作/挂钩绕过此限制的示例:

function new_attachment( $att_id ){
    // the post this was sideloaded into is the attachments parent!

    // fetch the attachment post
    $att = get_post( $att_id );

    // grab it\'s parent
    $post_id = $att->post_parent;

    // set the featured post
    set_post_thumbnail( $post_id, $att_id );
}

// add the function above to catch the attachments creation
add_action(\'add_attachment\',\'new_attachment\');

// load the attachment from the URL
media_sideload_image($image_url, $post_id, $post_id);

// we have the image now, and the function above will have fired too setting the thumbnail ID in the process, so lets remove the hook so we don\'t cause any more trouble 
remove_action(\'add_attachment\',\'new_attachment\');
我们的想法是media_sideload_image 已运行,它:

下载图像并将其添加为附件(类型为attachment )

  • 然后将该附件附加到您提供的ID(post\\u ID)的帖子上。
    • 您的问题是它没有提供新创建的附件帖子ID。

      But, 创建附件时,将触发一个包含其ID的操作。我们可以在创建附件之前挂接到此操作,并使用它提供给我们的帖子ID保存特色缩略图,然后取消挂接。

    SO网友:olaf

    不再需要旧的解决方案。

    您可以通过将第四个参数($return)设置为“ID”来获取ID

    <?php media_sideload_image($file, $post_id, $desc, $return); ?> 
    

    https://codex.wordpress.org/Function_Reference/media_sideload_image

    SO网友:yondemon

    我已经构建了一个函数来从DB获取ID,通过URL进行搜索。

    function get_attachment_id_from_src ($image_src) {
      global $wpdb;
      $query = "SELECT ID FROM {$wpdb->posts} WHERE guid=\'$image_src\'";
      $id = $wpdb->get_var($query);
      return $id;
    }
    
    您可以通过将第四个参数设置为\'src\' Codex: media_sideload_image()

    $src = media_sideload_image($url, $item_id, $desc,\'src\');
    get_attachment_id_from_src($src);
    

    SO网友:Jorge Orpinel Pérez

    @汤姆·诺厄尔的回答很准确。我找到了另一种选择(使用不同的函数)explained here 但我更喜欢这个。

    在我的例子中,我有一个$posts数组,其中包含我要插入的所有帖子,还有一个单独的$媒体(与$posts相同的$nid键)。我的代码与Tom的解决方案相同,但经过重构后使用匿名函数:

    foreach( $posts as $nid=>$post )
        $posts[$nid][\'ID\'] = wp_insert_post( $post );
    
    foreach( $posts as $nid=>$post )
        foreach( $media[$nid] as $m=>$mitem ) {
    
            if( 0 == $m ) add_action( \'add_attachment\',
                function( $att_id ) use ($posts, $nid, $mitem) {
                    update_post_meta($posts[$nid][\'ID\'], \'_thumbnail_id\', $att_id);
                    $posts[$nid][\'media_urls\'][] = $mitem[\'url\'];
                }
            );
            media_sideload_image($mitem[\'url\'], $post[\'ID\']);
            remove_all_actions( \'add_attachment\' );
        }
    
    在我的情况下,我假设每个$media[$nid]shuld中的第一个项目是其帖子的特色图片。

    WordPress应该明确更改media\\u sideload\\u image(),以便返回$id。事实上,函数已经准备好了,请参见source here. 事实上track ticket for this 如果你愿意的话,他们甚至有补丁可以同时将其应用到你的核心部位。

    SO网友:Dario Zadro

    我正在寻找解决方案,并决定查看media_sideload_image() 这很简单。它使用media_handle_sideload() 这给了我们附件id.

    我修改了它以返回附件id 而不是图像的html源代码,甚至添加了一种发送新文件名的方式。

    function media_sideload_image_custom($file, $post_id, $desc = null, $file_name = null)
    {
        if ( ! empty($file) ) {
            // Download file to temp location
            $tmp = download_url( $file );
    
            // fix file filename for query strings
            if( empty($file_name) ) { 
                preg_match(\'/[^\\?]+\\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/\', $file, $matches);
                $file_array[\'name\'] = basename($matches[0]);
            } else {
                $file_array[\'name\'] = sanitize_file_name($file_name);
            }
            $file_array[\'tmp_name\'] = $tmp;
    
            // If error storing temporarily, unlink
            if ( is_wp_error( $tmp ) ) {
                @unlink($file_array[\'tmp_name\']);
                $file_array[\'tmp_name\'] = \'\';
            }
    
            // do the validation and storage stuff
            $id = media_handle_sideload( $file_array, $post_id, $desc );
    
            // If error storing permanently, unlink
            if ( is_wp_error($id) ) {
                @unlink($file_array[\'tmp_name\']);
            }
            return $id;
        }
        return null;
    }
    

    结束

    相关推荐

    404从wp-Content/Uploads/获取图像时

    我在获取图像时获得404状态,http仍然包含该图像。图像显示在浏览器中,但404代码中断了一些应用程序。对wp内容/上载/的调用被重定向到。htaccess:<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\\.php$ - [L] RewriteRule (.*) /index.php?getfile=$1 [L] </IfModule>&