How to Add Images to Media Library after Uploading them in PHP Programmatically
When you upload files from WordPress admin area, they will automatically appear in Media > Library. But what if you want to create a custom file uploader specially for your website visitors?
I placed the PHP file process_upload.php into the theme directory, if you would like to move it to the other location, do not forget to make changes in the next piece of code on line 4 (I mean code in Step 2).
The form must have enctype="multipart/form-data" attribute. Many forget about it.
You can also create a shortcode for this form, just insert this to the functions.php:
Now you can use just [misha_uploader] in the editor.
Step 2. Process the Uploaded File in PHP and Add the File Metadata to WordPress Database
This is process_upload.php file that I decided to create in my current theme directory.
<?php// WordPress environmentrequire( dirname(__FILE__).'/../../../wp-load.php' );$wordpress_upload_dir =wp_upload_dir();// $wordpress_upload_dir['path'] is the full server path to wp-content/uploads/2017/05, for multisite works good as well// $wordpress_upload_dir['url'] the absolute URL to the same folder, actually we do not need it, just to show the link to file$i =1; // number of tries when the file with the same name is already exists$profilepicture = $_FILES['profilepicture'];$new_file_path = $wordpress_upload_dir['path'] .'/'. $profilepicture['name'];$new_file_mime =mime_content_type( $profilepicture['tmp_name'] );if( empty( $profilepicture ) )die( 'File is not selected.' );if( $profilepicture['error'] )die( $profilepicture['error'] );if( $profilepicture['size'] >wp_max_upload_size() )die( 'It is too large than expected.' );if( !in_array( $new_file_mime, get_allowed_mime_types()) )die( 'WordPress doesn\'t allow this type of uploads.' );while( file_exists( $new_file_path ) ) { $i++; $new_file_path = $wordpress_upload_dir['path'] .'/'. $i .'_'. $profilepicture['name'];}// looks like everything is OKif( move_uploaded_file( $profilepicture['tmp_name'], $new_file_path ) ) { $upload_id =wp_insert_attachment( array('guid'=> $new_file_path,'post_mime_type'=> $new_file_mime,'post_title'=> preg_replace('/\.[^.]+$/','', $profilepicture['name'] ),'post_content'=>'','post_status'=>'inherit' ), $new_file_path );// wp_generate_attachment_metadata() won't work if you do not include this filerequire_once( ABSPATH .'wp-admin/includes/image.php' );// Generate and save the attachment metas into the databasewp_update_attachment_metadata( $upload_id, wp_generate_attachment_metadata( $upload_id, $new_file_path ));// Show the uploaded file in browserwp_redirect( $wordpress_upload_dir['url'] .'/'. basename( $new_file_path ));}
Optionally we can set the third parameter of the wp_insert_attachment() as a parent post ID, and set the featured image of this post with set_post_thumbnail().
It is easier to organize your uploaded images from WordPress Media Library.
All the photos on the screenshot are taken by me in Roza Khutor resort.