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

ok

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?

Under this image you will find a PHP script that can upload files to your uploads directory and add them automatically to WordPress Media Library.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?