问题描述
我想上传一个图像,并将其设置为一个特色的图像在一个帖子。我试过的是这样的:
$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?
最佳解决方案
以下是使用动作/钩子绕过此限制的示例:
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_id)
您的问题是它不提供新创建的附件帖子 ID 。
但是,当创建附件时,会触发一个包含其 ID 的操作。我们可以在创建附件之前勾选此内容,并使用它给我们的帖子 ID 保存特色缩略图,然后取消挂起。
次佳解决方案
我已经建立了一个函数来获取 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()的网址 (html 代码)
$src = media_sideload_image($url, $item_id, $desc,'src');
get_attachment_id_from_src($src);
第三种解决方案
诺托维尔的答案是现在的。我发现另一个选择 (使用不同的功能)explained here,但我更喜欢这一个。
在我的情况下,我有一个 $的帖子,我要插入的所有帖子和一个单独的 $媒体 (与 $ 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' );
}
在我的情况下,我假设每个 $媒体 [$ nid] 中的第一个项目是他的帖子的特色图像。
WordPress shouold 肯定会改变 media_sideload_image() 所以它返回 $ id 。实际上该功能已经在手边,请参阅 source here 。实际上有一个 track ticket for this,如果你愿意的话,他们甚至还有补丁应用到你的核心。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。