使用media_sideload_image()上传后获得$ image_id


10

我想上传图片并将其设置为帖子中的精选图片。我试过的是:

$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

Answers:


28

这是如何使用动作/挂钩绕过此限制的示例:

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运行时,它:

  • 下载图片
  • 将其添加为附件(类型为post attachment
  • 然后将该附件附加到您提供其ID($ post_id)的帖子中

您的问题是它不提供新创建的附件帖子ID。

但是,创建附件后,将触发包含其ID的操作。在创建附件之前,我们可以将其挂钩,然后将精选的缩略图与它给我们的帖子ID保存在一起,然后再将其取消挂钩。


1
辉煌!那很有帮助。
m-torin 2014年

2
如果回答了您的问题,您可以将其标记为正确吗?
汤姆·J·诺维尔

我看不懂你的英语。有人可以编辑这篇文章吗?
HiDd3N

2
@ HiDd3N我已经简化了一些英语的使用,它应该有较普通的单词,且阅读年龄较低
Tom J Nowell

6

我建立了一个从数据库获取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;
}

您可以获取第四个参数设置为Codex的 URL(由html代码'src' 插入):media_sideload_image()

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


4

@Tom J Nowell的答案是正确的。我在这里找到了另一种解释(使用不同的功能)但我对此很喜欢。

在我的情况下,我有一个$ posts数组,其中包含所有要插入的帖子,以及一个单独的$ media(与$ 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] shuold中的第一项都是其帖子的特色图片。

WordPress应该绝对更改media_sideload_image(),以便它返回$ id。实际上,该功能已在手边,请参见此处源代码。实际上,这里有一个跟踪单,如果您愿意,他们甚至可以同时将其应用到您的核心中。


像它看起来真实预计在4.8得到修补
汤姆·奥格

3

我一直在寻找解决方案,并决定查看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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.