正如@Rarst所说,处理外部上传和创建相关附件帖子最方便的方法是使用media_sideload_image()
, 此功能:
下载url,验证它是否是有效的a图像,如果是,则创建附件帖子,将此附件附加到id作为参数传递的特定帖子img
然而,有时人们可能只想访问附件帖子id,而对将附件附加到任何帖子不感兴趣,在这种情况下WordPress没有内置功能,因此最方便的方法是从media_sideload_image()
和部分media_handle_sideload()
:
function custom_media_sideload_image( $image_url = \'\', $post_id = false ) {
require_once ABSPATH . \'wp-admin/includes/file.php\';
$tmp = download_url( $image_url );
// Set variables for storage
// fix file filename for query strings
preg_match( \'/[^\\?]+\\.(jpe?g|jpe|gif|png)\\b/i\', $image_url, $matches );
$file_array[\'name\'] = basename($matches[0]);
$file_array[\'tmp_name\'] = $tmp;
// If error storing temporarily, unlink
if ( is_wp_error( $tmp ) ) {
@unlink($file_array[\'tmp_name\']);
$file_array[\'tmp_name\'] = \'\';
}
$time = current_time( \'mysql\' );
$file = wp_handle_sideload( $file_array, array(\'test_form\'=>false), $time );
if ( isset($file[\'error\']) ) {
return new WP_Error( \'upload_error\', $file[\'error\'] );
}
$url = $file[\'url\'];
$type = $file[\'type\'];
$file = $file[\'file\'];
$title = preg_replace(\'/\\.[^.]+$/\', \'\', basename($file) );
$parent = (int) absint( $post_id ) > 0 ? absint($post_id) : 0;
$attachment = array(
\'post_mime_type\' => $type,
\'guid\' => $url,
\'post_parent\' => $parent,
\'post_title\' => $title,
\'post_content\' => \'\',
);
$id = wp_insert_attachment($attachment, $file, $parent);
if ( !is_wp_error($id) ) {
require_once ABSPATH . \'wp-admin/includes/image.php\';
$data = wp_generate_attachment_metadata( $id, $file );
wp_update_attachment_metadata( $id, $data );
}
return $id;
}
此函数的作用是
media_sideload_image()
但返回附件id,或
WP_Error
如果出了问题。
它需要一个可选参数$post_id
将媒体附加到特定帖子/页面,但如果未通过,则会创建附加帖子,但不会附加到任何帖子。