I have succeeded. The code works with the latest version of Wordpress (4.9.4)
First of all, I use XMLHttpRequest to send data, not jQuery ajax. This means that you can adapt it to pure JS. Pay attention to xhttp.setRequestHeader("enctype","multipart/form-data"); which is required to pass FormData using this method.
JS:
var user_id = $('#user_id').val(); var picture = $('#userPic')[0].files[0]; console.log(picture); if( picture && typeof picture !== undefined ) { if ( picture['size'] > 1000000 ) { alert('The Profile Pic can\'t be larger than 1Mb.'); return; } if ( picture['type'].indexOf('image') == -1 ) { alert('The uploaded file needs to be an image.'); return; } var data = new FormData(); data.append('user_id', user_id); data.append('userPic', picture);
Part of PHP is also extremely useful, as it requires the files necessary to manage the received data using the basic functions of WP. Here you will also find code to download attachments using the basic WP features.
PHP:
// error_reporting(-1); // ini_set('display_errors', 'On'); $path = $_SERVER['DOCUMENT_ROOT']; require_once($path.'/wp-load.php'); require_once( '/home/s24t06b21lk5/public_html/wp-includes/template-loader.php' ); // require_once("/home/s24t06b21lk5/public_html/wp-admin" . '/includes/image.php'); require_once("/home/s24t06b21lk5/public_html/wp-admin" . '/includes/file.php'); // require_once("/home/s24t06b21lk5/public_html/wp-admin" . '/includes/media.php'); $user_id = $_POST['user_id']; $picture = $_FILES['userPic']; var_dump($user_id); var_dump($picture); $response = array(); if( isset($picture['name']) && $picture['name'] ) { // Get the path to the upload directory. $wp_upload_dir = wp_upload_dir(); $picture['name'] = preg_replace( '/[^0-9a-zA-Z.]/', '', basename( $picture['name'] ) ); // Upload the file $upload_overrides = array( 'test_form' => false ); $upload_result = wp_handle_upload($picture, $upload_overrides); // echo '<pre>'; print_r($upload_result); echo '</pre>' ; if( $upload_result['url'] ) { // Prepare an array of post data for the attachment. $attachment = array( 'guid' => $upload_result['url'], 'post_mime_type' => $picture['type'], 'post_title' => $picture['name'], 'post_content' => '', 'post_status' => 'inherit' ); $attach_id = wp_insert_attachment( $attachment, $upload_result['file'] ); if( $attach_id ) { // Make sure that this file is included, as wp_generate_attachment_metadata() depends on it. require_once( ABSPATH . 'wp-admin/includes/image.php' ); // Generate the metadata for the attachment, and update the database record. $attach_data = wp_generate_attachment_metadata( $attach_id, $upload_result['file'] ); wp_update_attachment_metadata( $attach_id, $attach_data ); // Update the usermeta table with the uploaded avatar if( !update_user_meta($user_id, 'wp_user_avatar', $attach_id ) || !update_user_meta($user_id, 'wp_zfgrf5v7rw_user_avatar', $attach_id) ) { $response['result'] = FALSE; $response['message'] = "The uploaded image could not be associated with the User ID in the database."; } else { $response['result'] = TRUE; } } else { $response['result'] = FALSE; $response['message'] = "Wordpress attachment post for the user image could not created."; } } else { $response['result'] = FALSE; $response['message'] = "The file couldn't be uploaded. Check the permissions."; } } die( json_encode($response) );
Thanks.
source share