How to upload files to WordPress programmatically
May 18, 2019
If you’re trying to find a way to upload files into WordPress uploads folder/media library programmatically and are tired of all the complex upload_bits methods, you’re in luck. In this article I’m going to show you a few ways to upload files into WordPress programmatically.
These are your options:
The “I need to upload an image, no other file types needed” option
You can use media_sideload_image() function built in WordPress core. Please note that it only accepts files in jpeg, gif and png formats.
<?php
$url = "https://www.example.com/file-url.jpg";
$post_id = 1;
$desc = "Image description";
media_sideload_image($url, $post_id, $desc, 'id');
// Returns image id or WP_Error
The “I need to upload other file types too” option
Put this modified version of the media_sideload_image() into your functions.php, add needed file type extensions to the preg_match and modify it even further if needed:
<?php
function wpa_sideload_file( $file, $post_id = 0, $desc = null ) {
if( empty( $file ) ) {
return new \WP_Error( 'error', 'File is empty' );
}
$file_array = array();
// Get filename and store it into $file_array
// Add more file types if necessary
preg_match( '/[^\?]+\.(jpe?g|jpe|gif|png|pdf)\b/i', $file, $matches );
$file_array['name'] = basename( $matches[0] );
// Download file into temp location.
$file_array['tmp_name'] = download_url( $file );
// If error storing temporarily, return the error.
if ( is_wp_error( $file_array['tmp_name'] ) ) {
return new \WP_Error( 'error', 'Error while storing file temporarily' );
}
// Store and validate
$id = media_handle_sideload( $file_array, $post_id, $desc );
// Unlink if couldn't store permanently
if ( is_wp_error( $id ) ) {
unlink( $file_array['tmp_name'] );
return new \WP_Error( 'error', "Couldn't store upload permanently" );
}
if ( empty( $id ) ) {
return new \WP_Error( 'error', "Upload ID is empty" );
}
return $id;
}
then just call it like this:
<?php
$url = "https://www.example.com/file-url.jpg";
$post_id = 1; // Use 0 if you don't want to attach the image into a post.
$desc = "File description";
wpa_sideload_file($url, $post_id, $desc);
// Returns image id or WP_Error