Answers:
这是如何使用动作/挂钩绕过此限制的示例:
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。
但是,创建附件后,将触发包含其ID的操作。在创建附件之前,我们可以将其挂钩,然后将精选的缩略图与它给我们的帖子ID保存在一起,然后再将其取消挂钩。
我建立了一个从数据库获取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);
不再需要较旧的解决方案。
您可以将第四个参数($ return)设置为'id'来获取ID
<?php media_sideload_image($file, $post_id, $desc, $return); ?>
https://codex.wordpress.org/Function_Reference/media_sideload_image
@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。实际上,该功能已在手边,请参见此处的源代码。实际上,这里有一个跟踪单,如果您愿意,他们甚至可以同时将其应用到您的核心中。
我一直在寻找解决方案,并决定查看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;
}