How to Add Images to Media Library after Uploading them in PHP Programmatically phần 3 (ok)
https://rudrastyh.com/wordpress/how-to-add-images-to-media-library-from-uploaded-files-programmatically.html

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?
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.
Step 1. As usual, we Begin with HTML Form
<form action="<?php echo get_stylesheet_directory_uri() ?>/process_upload.php" method="post" enctype="multipart/form-data">
Your Photo: <input type="file" name="profilepicture" size="25" />
<input type="submit" name="submit" value="Submit" />
</form>
What is important to remember here?
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
:
add_shortcode( 'misha_uploader', 'misha_uploader_callback' );
function misha_uploader_callback(){
return '<form action="' . get_stylesheet_directory_uri() . '/process_upload.php" method="post" enctype="multipart/form-data">
Your Photo: <input type="file" name="profilepicture" size="25" />
<input type="submit" name="submit" value="Submit" />
</form>';
}
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 environment
require( 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 OK
if( 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 file
require_once( ABSPATH . 'wp-admin/includes/image.php' );
// Generate and save the attachment metas into the database
wp_update_attachment_metadata( $upload_id, wp_generate_attachment_metadata( $upload_id, $new_file_path ) );
// Show the uploaded file in browser
wp_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()
.
Last updated
Was this helpful?