core_upload_dir = DIRECTORY_SEPARATOR . 'ultimatemember' . DIRECTORY_SEPARATOR; $this->core_upload_url = '/ultimatemember/'; $this->upload_image_type = 'stream_photo'; $this->wp_upload_dir = wp_upload_dir(); $this->temp_upload_dir = 'temp'; add_filter( 'upload_dir', array( $this, 'set_upload_directory' ), 10, 1 ); add_filter( 'wp_handle_upload_prefilter', array( $this, 'validate_upload' ) ); add_filter( 'um_upload_image_result', array( $this, 'rotate_uploaded_image' ), 10, 1 ); add_filter( 'um_upload_image_process__profile_photo', array( $this, 'profile_photo' ), 10, 7 ); add_filter( 'um_upload_image_process__cover_photo', array( $this, 'cover_photo' ), 10, 7 ); add_action( 'um_upload_stream_image_process', array( $this, 'stream_photo' ), 10, 7 ); add_action( 'init', array( $this, 'init' ) ); //remove user old files add_action( 'um_after_move_temporary_files', array( $this, 'remove_unused_uploads' ), 10, 3 ); } /** * Init */ function init() { $this->user_id = get_current_user_id(); } /** * Get core temporary directory path * * @since 2.0.22 * @return string */ public function get_core_temp_dir() { return $this->get_upload_base_dir(). $this->temp_upload_dir; } /** * Get core temporary directory URL * * @since 2.0.22 * @return string */ public function get_core_temp_url() { return $this->get_upload_base_url(). $this->temp_upload_dir; } /** * Get core upload directory * * @since 2.0.22 * @return string */ public function get_core_upload_dir() { return $this->core_upload_dir; } /** * Get core upload base url * * @since 2.0.22 * @return string */ public function get_upload_base_url() { $wp_baseurl = $this->wp_upload_dir['baseurl']; $this->upload_baseurl = set_url_scheme( $wp_baseurl . $this->core_upload_url ); return $this->upload_baseurl; } /** * Get core upload base directory * * @since 2.0.22 * @return string */ public function get_upload_base_dir() { $wp_basedir = $this->wp_upload_dir['basedir']; $this->upload_basedir = $wp_basedir . $this->core_upload_dir; return $this->upload_basedir; } /** * Get user upload base directory * * @param integer $user_id * @param bool $create_dir * * @since 2.0.22 * * @return string */ public function get_upload_user_base_dir( $user_id = null, $create_dir = false ) { if ( $user_id ) { $this->user_id = $user_id; } $this->upload_user_basedir = $this->get_upload_base_dir() . $this->user_id; if ( $create_dir ) { wp_mkdir_p( $this->upload_user_basedir ); } return $this->upload_user_basedir; } /** * Get user upload base url * * @param integer $user_id * @since 2.0.22 * @return string */ public function get_upload_user_base_url( $user_id = null ) { if ( $user_id ) { $this->user_id = $user_id; } $this->upload_user_baseurl = $this->get_upload_base_url() . $this->user_id; return $this->upload_user_baseurl; } /** * Validate file size * @param array $file * @return array */ public function validate_upload( $file ) { $error = false; if ( 'image' == $this->upload_type ) { $error = $this->validate_image_data( $file['tmp_name'], $this->field_key ); } elseif( 'file' == $this->upload_type ) { $error = $this->validate_file_data( $file['tmp_name'], $this->field_key ); } if ( $error ) { $file['error'] = $error; } return $file; } /** * Set upload directory * * @param array $args * * @return array */ public function set_upload_directory( $args ) { $this->upload_baseurl = $args['baseurl'] . $this->core_upload_url; $this->upload_basedir = $args['basedir'] . $this->core_upload_dir; if ( 'image' == $this->upload_type && is_user_logged_in() ) { if ( 'stream_photo' == $this->upload_image_type ) { $this->upload_user_baseurl = $this->upload_baseurl . $this->temp_upload_dir; $this->upload_user_basedir = $this->upload_basedir . $this->temp_upload_dir; } else { $this->upload_user_baseurl = $this->upload_baseurl . $this->user_id; $this->upload_user_basedir = $this->upload_basedir . $this->user_id; } } else { $this->upload_user_baseurl = $this->upload_baseurl . $this->temp_upload_dir; $this->upload_user_basedir = $this->upload_basedir . $this->temp_upload_dir; } list( $this->upload_user_baseurl, $this->upload_user_basedir ) = apply_filters( 'um_change_upload_user_path', array( $this->upload_user_baseurl, $this->upload_user_basedir ), $this->field_key, $this->upload_type ); if ( $this->replace_upload_dir ) { $args['path'] = $this->upload_user_basedir; $args['url'] = $this->upload_user_baseurl; } return $args; } /** * Upload Image files * * @param array $uploadedfile * @param int|null $user_id * @param string $field_key * @param string $upload_type * * @since 2.0.22 * * @return array * @throws Exception */ public function upload_image( $uploadedfile, $user_id = null, $field_key = '', $upload_type = 'stream_photo' ) { $response = array(); if ( ! function_exists( 'wp_handle_upload' ) ) { require_once ABSPATH . 'wp-admin/includes/file.php'; } if ( empty( $field_key ) ) { $field_key = 'custom_field'; } $this->field_key = $field_key; $this->upload_type = 'image'; $this->upload_image_type = $upload_type; if ( $user_id && is_user_logged_in() ) { $this->user_id = $user_id; } if ( in_array( $field_key, array( 'profile_photo', 'cover_photo' ), true ) ) { $this->upload_image_type = $field_key; } $field_data = UM()->fields()->get_field( $field_key ); if ( ! empty( $field_data['allowed_types'] ) ) { $field_allowed_file_types = explode( ',', $field_data['allowed_types'] ); } else { $field_allowed_file_types = apply_filters( 'um_uploader_image_default_filetypes', array( 'JPG', 'JPEG', 'PNG', 'GIF' ) ); } $allowed_image_mimes = array(); foreach ( $field_allowed_file_types as $a ) { $atype = wp_check_filetype( "test.{$a}" ); $allowed_image_mimes[ $atype['ext'] ] = $atype['type']; } $upload_overrides = array( 'test_form' => false, 'mimes' => apply_filters( 'um_uploader_allowed_image_mimes', $allowed_image_mimes ), 'unique_filename_callback' => array( $this, 'unique_filename' ), ); $upload_overrides = apply_filters( "um_image_upload_handler_overrides__{$field_key}", $upload_overrides ); $movefile = wp_handle_upload( $uploadedfile, $upload_overrides ); if ( isset( $movefile['error'] ) ) { /* * Error generated by _wp_handle_upload() * @see _wp_handle_upload() in wp-admin/includes/file.php */ $response['error'] = $movefile['error']; } else { /** * UM hook * * @type filter * @title um_upload_image_result * @description Filter uploaded image data * @input_vars [ * {"var":"$movefile", "type":"array", "desc":"Uploaded file info"}, * {"var":"$user_id", "type":"int", "desc":"User ID"}, * {"var":"$field_data", "type":"array", "desc":"Field data"} * ] * @change_log * ["Since: 2.1.6"] * @example */ $movefile = apply_filters( 'um_upload_image_result', $movefile, $user_id, $field_data ); /** * Resize and compress images uploaded by the field "Image Upload" without crop. * Resize and compress images uploaded on Activity wall and Group Discussion wall. * @since 2.1.16 2021-02-16 */ if ( $field_key === 'wall_img_upload' || empty( $field_data['crop_data'] ) ) { $this->stream_photo( $movefile, $movefile['file'], $movefile['url'], $field_key, $user_id ); } $movefile['url'] = set_url_scheme( $movefile['url'] ); $path = $movefile['file']; $movefile['file'] = $movefile['file_info']['basename'] = wp_basename( $movefile['file'] ); $file_type = wp_check_filetype( $movefile['file_info']['basename'] ); $movefile['file_info']['name'] = $movefile['url']; $movefile['file_info']['original_name'] = $uploadedfile['name']; $movefile['file_info']['ext'] = $file_type['ext']; $movefile['file_info']['type'] = $file_type['type']; $movefile['file_info']['size'] = filesize( $path ); $movefile['file_info']['size_format'] = size_format( $movefile['file_info']['size'] ); /** * UM hook * * @type action * @title um_before_upload_db_meta * @description Update user's meta before upload * @input_vars * [{"var":"$user_id","type":"int","desc":"User ID"}, * {"var":"$key","type":"string","desc":"Meta key"}] * @change_log * ["Since: 2.0"] * @usage add_action( 'um_before_upload_db_meta', 'function_name', 10, 2 ); * @example * */ do_action( 'um_before_upload_db_meta', $this->user_id, $field_key ); /** * UM hook * * @type action * @title um_before_upload_db_meta_{$key} * @description Update user's meta before upload * @input_vars * [{"var":"$user_id","type":"int","desc":"User ID"}] * @change_log * ["Since: 2.0"] * @usage add_action( 'um_before_upload_db_meta_{$key}', 'function_name', 10, 1 ); * @example * */ do_action( "um_before_upload_db_meta_{$field_key}", $this->user_id ); /** * UM hook * * @type action * @title um_after_upload_db_meta * @description Update user's meta before upload * @input_vars * [{"var":"$user_id","type":"int","desc":"User ID"}, * {"var":"$key","type":"string","desc":"Meta key"}] * @change_log * ["Since: 2.0"] * @usage add_action( 'um_after_upload_db_meta', 'function_name', 10, 2 ); * @example * */ do_action( 'um_after_upload_db_meta', $this->user_id, $field_key ); /** * UM hook * * @type action * @title um_after_upload_db_meta_{$key} * @description Update user's meta after upload * @input_vars * [{"var":"$user_id","type":"int","desc":"User ID"}] * @change_log * ["Since: 2.0"] * @usage add_action( 'um_after_upload_db_meta_{$key}', 'function_name', 10, 1 ); * @example * */ do_action( "um_after_upload_db_meta_{$field_key}", $this->user_id ); $transient = set_transient( "um_{$movefile['file']}", $movefile['file_info'], 2 * HOUR_IN_SECONDS ); if ( empty( $transient ) ) { update_user_meta( $this->user_id, "{$field_key}_metadata_temp", $movefile['file_info'] ); } } $response['handle_upload'] = $movefile; // Remove old files from 'temp' directory UM()->files()->remove_old_files( UM()->files()->upload_temp ); return $response; } /** * Upload Files * * @since 2.0.22 * * @param $uploadedfile * @param int|null $user_id * @param string $field_key * * @return array * @throws Exception */ public function upload_file( $uploadedfile, $user_id = null, $field_key = '' ) { $response = array(); if ( ! function_exists( 'wp_handle_upload' ) ) { require_once ABSPATH . 'wp-admin/includes/file.php'; } $this->field_key = $field_key; if ( $user_id && is_user_logged_in() ) { $this->user_id = $user_id; } $this->upload_type = 'file'; $field_data = UM()->fields()->get_field( $field_key ); $field_allowed_file_types = explode( ',', $field_data['allowed_types'] ); $allowed_file_mimes = array(); foreach ( $field_allowed_file_types as $a ) { $atype = wp_check_filetype( "test.{$a}" ); $allowed_file_mimes[ $atype['ext'] ] = $atype['type']; } $upload_overrides = array( 'test_form' => false, 'mimes' => apply_filters( 'um_uploader_allowed_file_mimes', $allowed_file_mimes ), 'unique_filename_callback' => array( $this, 'unique_filename' ), ); $upload_overrides = apply_filters( "um_file_upload_handler_overrides__{$field_key}", $upload_overrides ); $movefile = wp_handle_upload( $uploadedfile, $upload_overrides ); if ( isset( $movefile['error'] ) ) { /* * Error generated by _wp_handle_upload() * @see _wp_handle_upload() in wp-admin/includes/file.php */ $response['error'] = $movefile['error']; } else { $file_type = wp_check_filetype( $movefile['file'] ); $movefile['url'] = set_url_scheme( $movefile['url'] ); $movefile['file_info']['name'] = $movefile['url']; $movefile['file_info']['original_name'] = $uploadedfile['name']; $movefile['file_info']['basename'] = wp_basename( $movefile['file'] ); $movefile['file_info']['ext'] = $file_type['ext']; $movefile['file_info']['type'] = $file_type['type']; $movefile['file_info']['size'] = filesize( $movefile['file'] ); $movefile['file_info']['size_format'] = size_format( $movefile['file_info']['size'] ); /** * UM hook * * @type action * @title um_before_upload_db_meta * @description Update user's meta before upload * @input_vars * [{"var":"$user_id","type":"int","desc":"User ID"}, * {"var":"$key","type":"string","desc":"Meta key"}] * @change_log * ["Since: 2.0"] * @usage add_action( 'um_before_upload_db_meta', 'function_name', 10, 2 ); * @example * */ do_action( 'um_before_upload_db_meta', $this->user_id, $field_key ); /** * UM hook * * @type action * @title um_before_upload_db_meta_{$key} * @description Update user's meta before upload * @input_vars * [{"var":"$user_id","type":"int","desc":"User ID"}] * @change_log * ["Since: 2.0"] * @usage add_action( 'um_before_upload_db_meta_{$key}', 'function_name', 10, 1 ); * @example * */ do_action( "um_before_upload_db_meta_{$field_key}", $this->user_id ); /** * UM hook * * @type action * @title um_after_upload_db_meta * @description Update user's meta before upload * @input_vars * [{"var":"$user_id","type":"int","desc":"User ID"}, * {"var":"$key","type":"string","desc":"Meta key"}] * @change_log * ["Since: 2.0"] * @usage add_action( 'um_after_upload_db_meta', 'function_name', 10, 2 ); * @example * */ do_action( 'um_after_upload_db_meta', $this->user_id, $field_key ); /** * UM hook * * @type action * @title um_after_upload_db_meta_{$key} * @description Update user's meta after upload * @input_vars * [{"var":"$user_id","type":"int","desc":"User ID"}] * @change_log * ["Since: 2.0"] * @usage add_action( 'um_after_upload_db_meta_{$key}', 'function_name', 10, 1 ); * @example * */ do_action( "um_after_upload_db_meta_{$field_key}", $this->user_id ); //update_user_meta( $this->user_id, $field_key, wp_basename( $movefile['url'] ) ); $filename = wp_basename( $movefile['url'] ); $transient = set_transient( "um_{$filename}", $movefile['file_info'], 2 * HOUR_IN_SECONDS ); if ( empty( $transient ) ) { update_user_meta( $this->user_id, "{$field_key}_metadata_temp", $movefile['file_info'] ); } } $response['handle_upload'] = $movefile; // Remove old files from 'temp' directory UM()->files()->remove_old_files( UM()->files()->upload_temp ); return $response; } /** * Check image upload and handle errors * * @param $file * @param $field * * @return null|string */ public function validate_image_data( $file, $field_key ) { $error = null; if ( ! function_exists( 'wp_get_image_editor' ) ) { require_once ABSPATH . 'wp-admin/includes/media.php'; } $image = wp_get_image_editor( $file ); if ( is_wp_error( $image ) ) { $error = sprintf( __( 'Your image is invalid!', 'ultimate-member' ) ); return $error; } $image_sizes = $image->get_size(); $image_info['width'] = $image_sizes['width']; $image_info['height'] = $image_sizes['height']; $image_info['ratio'] = $image_sizes['width'] / $image_sizes['height']; $image_info['quality'] = $image->get_quality(); $image_type = wp_check_filetype( $file ); $image_info['extension'] = $image_type['ext']; $image_info['mime']= $image_type['type']; $image_info['size'] = filesize( $file ); $data = UM()->fields()->get_field( $field_key ); if ( $data == null ) { /** * UM hook * * @type filter * @title um_custom_image_handle_{$field} * @description Custom image handle * @input_vars * [{"var":"$data","type":"array","desc":"Image Data"}] * @change_log * ["Since: 2.0"] * @usage add_filter( 'um_custom_image_handle_{$field}', 'function_name', 10, 1 ); * @example * */ $data = apply_filters( "um_custom_image_handle_{$field_key}", array() ); if ( ! $data ) { $error = __( 'This media type is not recognized.', 'ultimate-member' ); } } /** * UM hook * * @type filter * @title um_image_handle_global__option * @description Custom image global handle * @input_vars * [{"var":"$data","type":"array","desc":"Image Data"}] * @change_log * ["Since: 2.0"] * @usage add_filter( 'um_image_handle_global__option', 'function_name', 10, 1 ); * @example * */ $data = apply_filters("um_image_handle_global__option", $data ); /** * UM hook * * @type filter * @title um_image_handle_{$field}__option * @description Custom image handle for each $field * @input_vars * [{"var":"$data","type":"array","desc":"Image Data"}] * @change_log * ["Since: 2.0"] * @usage add_filter( 'um_image_handle_{$field}__option', 'function_name', 10, 1 ); * @example * */ $data = apply_filters( "um_image_handle_{$field_key}__option", $data ); if ( isset( $image_info['invalid_image'] ) && $image_info['invalid_image'] == true ) { $error = sprintf(__('Your image is invalid or too large!','ultimate-member') ); } elseif ( isset( $data['min_size'] ) && ( $image_info['size'] < $data['min_size'] ) ) { $error = $data['min_size_error']; } elseif ( isset( $data['max_file_size'] ) && ( $image_info['size'] > $data['max_file_size'] ) ) { $error = $data['max_file_size_error']; } elseif ( isset( $data['min_width'] ) && ( $image_info['width'] < $data['min_width'] ) ) { // translators: %s: min widdth. $error = sprintf( __( 'Your photo is too small. It must be at least %spx wide.', 'ultimate-member' ), $data['min_width'] ); } elseif ( isset( $data['min_height'] ) && ( $image_info['height'] < $data['min_height'] ) ) { // translators: %s: min height. $error = sprintf( __( 'Your photo is too small. It must be at least %spx high.', 'ultimate-member' ), $data['min_height'] ); } return $error; } /** * Check file upload and handle errors * * @param $file * @param $field * * @return null|string */ public function validate_file_data( $file, $field_key ) { $error = null; if ( ! function_exists( 'wp_get_image_editor' ) ) { require_once ABSPATH . 'wp-admin/includes/media.php'; } $file_type = wp_check_filetype( $file ); $file_info = array(); $file_info['extension'] = $file_type['ext']; $file_info['mime']= $file_type['type']; $file_info['size'] = filesize( $file ); $data = UM()->fields()->get_field( $field_key ); if ( $data == null ) { /** * UM hook * * @type filter * @title um_custom_file_handle_{$field} * @description Custom file handle * @input_vars * [{"var":"$data","type":"array","desc":"Image Data"}] * @change_log * ["Since: 2.0"] * @usage add_filter( 'um_custom_file_handle_{$field}', 'function_name', 10, 1 ); * @example * */ $data = apply_filters( "um_custom_file_handle_{$field_key}", array() ); if ( ! $data ) { $error = __( 'This file type is not recognized.', 'ultimate-member' ); } } /** * UM hook * * @type filter * @title um_file_handle_global__option * @description Custom file global handle * @input_vars * [{"var":"$data","type":"array","desc":"Image Data"}] * @change_log * ["Since: 2.0"] * @usage add_filter( 'um_file_handle_global__option', 'function_name', 10, 1 ); * @example * */ $data = apply_filters("um_file_handle_global__option", $data ); /** * UM hook * * @type filter * @title um_file_handle_{$field}__option * @description Custom file handle for each $field * @input_vars * [{"var":"$data","type":"array","desc":"Image Data"}] * @change_log * ["Since: 2.0"] * @usage add_filter( 'um_file_handle_{$field}__option', 'function_name', 10, 1 ); * @example * */ $data = apply_filters( "um_file_handle_{$field_key}__option", $data ); if ( isset( $data['max_file_size'] ) && ( $file_info['size'] > $data['max_file_size'] ) ) { $error = $data['max_file_size_error']; } return $error; } /** * Make unique filename * * @param string $dir * @param string $filename * @param string $ext * @return string $filename * * @since 2.0.22 */ public function unique_filename( $dir, $filename, $ext ) { if ( empty( $ext ) ) { $image_type = wp_check_filetype( $filename ); $ext = strtolower( trim( $image_type['ext'], ' \/.' ) ); } else { $ext = strtolower( trim( $ext, ' \/.' ) ); } if ( 'image' == $this->upload_type ) { switch ( $this->upload_image_type ) { case 'stream_photo': $hashed = hash('ripemd160', time() . mt_rand( 10, 1000 ) ); $filename = "stream_photo_{$hashed}.{$ext}"; break; case 'profile_photo': case 'cover_photo': $filename = "{$this->upload_image_type}_temp.{$ext}"; break; } } elseif ( 'file' == $this->upload_type ) { $hashed = hash('ripemd160', time() . mt_rand( 10, 1000 ) ); $filename = "file_{$hashed}.{$ext}"; } $this->delete_existing_file( $filename, $ext, $dir ); return $filename; } /** * Delete file * @param string $filename * @param string $ext * @param string $dir * * @since 2.0.22 */ public function delete_existing_file( $filename, $ext = '', $dir = '' ) { if ( file_exists( $this->upload_user_basedir . DIRECTORY_SEPARATOR . $filename ) && ! empty( $filename ) ) { unlink( $this->upload_user_basedir . DIRECTORY_SEPARATOR . $filename ); } } /** * Profile photo image process * * @param array $response * @param string $image_path * @param string $src * @param string $key * @param int $user_id * @param string $coord * @param array $crop * * @since 2.0.22 * * @return array */ public function profile_photo( $response, $image_path, $src, $key, $user_id, $coord, $crop ) { $sizes = UM()->options()->get( 'photo_thumb_sizes' ); $quality = UM()->options()->get( 'image_compression' ); $image = wp_get_image_editor( $image_path ); // Return an implementation that extends WP_Image_Editor $temp_image_path = $image_path; // Refresh image_path to make temporary image permanently after upload $photo_ext = pathinfo( $image_path, PATHINFO_EXTENSION ); $image_path = pathinfo( $image_path, PATHINFO_DIRNAME ) . DIRECTORY_SEPARATOR . $key . '.' . $photo_ext; if ( ! is_wp_error( $image ) ) { $src_x = $crop[0]; $src_y = $crop[1]; $src_w = $crop[2]; $src_h = $crop[3]; $image->crop( $src_x, $src_y, $src_w, $src_h ); $max_w = UM()->options()->get( 'image_max_width' ); if ( $src_w > $max_w ) { $image->resize( $max_w, $src_h ); } $save_result = $image->save( $image_path ); if ( is_wp_error( $save_result ) ) { // translators: %s is the file src. wp_send_json_error( sprintf( __( 'Unable to crop image file: %s', 'ultimate-member' ), $src ) ); } $image->set_quality( $quality ); $sizes_array = array(); foreach ( $sizes as $size ) { $sizes_array[] = array( 'width' => $size ); } $image->multi_resize( $sizes_array ); delete_user_meta( $user_id, 'synced_profile_photo' ); unlink( $temp_image_path ); $basename = $key . '_temp.' . $photo_ext; $src = str_replace( '/' . $basename, '/' . $save_result['file'], $src ); $response['image']['source_url'] = $src; $response['image']['source_path'] = $save_result['path']; $response['image']['filename'] = $save_result['file']; update_user_meta( $this->user_id, $key, $save_result['file'] ); delete_user_meta( $this->user_id, "{$key}_metadata_temp" ); } else { // translators: %s is the file src. wp_send_json_error( sprintf( __( 'Unable to crop image file: %s', 'ultimate-member' ), $src ) ); } return $response; } /** * Cover photo image process * * @param string $src * @param int $user_id * @param string $coord * @param array $crop * @param array $response * * @since 2.0.22 * * @return array */ public function cover_photo( $response, $image_path, $src, $key, $user_id, $coord, $crop ) { $sizes = UM()->options()->get( 'cover_thumb_sizes' ); $quality = UM()->options()->get( 'image_compression' ); $image = wp_get_image_editor( $image_path ); // Return an implementation that extends WP_Image_Editor $temp_image_path = $image_path; // Refresh image_path to make temporary image permanently after upload $photo_ext = pathinfo( $image_path, PATHINFO_EXTENSION ); $image_path = pathinfo( $image_path, PATHINFO_DIRNAME ) . DIRECTORY_SEPARATOR . $key . '.' . $photo_ext; if ( ! is_wp_error( $image ) ) { $src_x = $crop[0]; $src_y = $crop[1]; $src_w = $crop[2]; $src_h = $crop[3]; $image->crop( $src_x, $src_y, $src_w, $src_h ); $max_w = UM()->options()->get( 'image_max_width' ); if ( $src_w > $max_w ) { $image->resize( $max_w, $src_h ); } $save_result = $image->save( $image_path ); if ( is_wp_error( $save_result ) ) { // translators: %s is the file src. wp_send_json_error( sprintf( __( 'Unable to crop image file: %s', 'ultimate-member' ), $src ) ); } $image->set_quality( $quality ); $sizes_array = array(); foreach ( $sizes as $size ) { $sizes_array[] = array( 'width' => $size ); } $resize = $image->multi_resize( $sizes_array ); // change filenames of resized images foreach ( $resize as $row ) { $new_filename = str_replace( "x{$row['height']}", '', $row['file'] ); $old_filename = $row['file']; rename( dirname( $image_path ) . DIRECTORY_SEPARATOR . $old_filename, dirname( $image_path ) . DIRECTORY_SEPARATOR . $new_filename ); } unlink( $temp_image_path ); $basename = $key . '_temp.' . $photo_ext; $src = str_replace( '/' . $basename, '/' . $save_result['file'], $src ); $response['image']['source_url'] = $src; $response['image']['source_path'] = $save_result['path']; $response['image']['filename'] = $save_result['file']; update_user_meta( $this->user_id, $key, $save_result['file'] ); delete_user_meta( $this->user_id, "{$key}_metadata_temp" ); } else { // translators: %s is the file src. wp_send_json_error( sprintf( __( 'Unable to crop image file: %s', 'ultimate-member' ), $src ) ); } return $response; } /** * Stream photo image process * * @param array $response * @param string $image_path * @param string $src * @param integer $user_id * @param string $coord * @param array $crop * * @since 2.0.22 * @version 2.1.16 2021-02-15 * * @return array */ public function stream_photo( $response, $image_path, $src, $key, $user_id, $coord = '', $crop = array() ) { /** * Return an implementation that extends WP_Image_Editor * @see https://developer.wordpress.org/reference/classes/wp_image_editor/ */ $image = wp_get_image_editor( $image_path ); if ( ! is_wp_error( $image ) ) { $quality = (int) UM()->options()->get( 'image_compression' ); $max_w = (int) UM()->options()->get( 'image_max_width' ); // Crop if ( ! empty( $crop ) ) { if ( ! is_array( $crop ) ) { $crop = explode( ",", $crop ); } $src_x = $crop[0]; $src_y = $crop[1]; $src_w = $crop[2]; $src_h = $crop[3]; $image->crop( $src_x, $src_y, $src_w, $src_h ); } // Resize $dimensions = $image->get_size(); if ( $dimensions['width'] > $max_w ) { $image->resize( $max_w, null ); } // Quality if ( $image->get_quality() > $quality ) { $image->set_quality( $quality ); } $image->save( $image_path ); } else { wp_send_json_error( esc_js( __( "Unable to crop stream image file: {$image_path}", 'ultimate-member' ) ) ); } return $response; } /** * Resize Image * * @param string $image_path * @param string $src * @param string $key * @param integer $user_id * @param string $coord * * @since 2.0.22 * * @return array */ public function resize_image( $image_path, $src, $key, $user_id, $coord ) { $crop = explode( ',', $coord ); $crop = array_map( 'intval', $crop ); $response = array( 'image' => array( 'source_url' => $src, 'source_path' => $image_path, 'filename' => wp_basename( $image_path ), ), ); $response = apply_filters( "um_upload_image_process__{$key}", $response, $image_path, $src, $key, $user_id, $coord, $crop ); if ( ! in_array( $key, array( 'profile_photo', 'cover_photo' ), true ) ) { $response = apply_filters( 'um_upload_stream_image_process', $response, $image_path, $src, $key, $user_id, $coord, $crop ); } return $response; } /** * Fix image orientation * * @since 2.1.6 * * @param array $movefile * @return array */ public function rotate_uploaded_image( $movefile ) { $image_fix_orientation = UM()->options()->get( 'image_orientation_by_exif' ); if ( $image_fix_orientation && $movefile['type'] == 'image/jpeg' ) { $image = imagecreatefromjpeg( $movefile['file'] ); if ( $image ) { $image = UM()->files()->fix_image_orientation( $image, $movefile['file'] ); $quality = UM()->options()->get( 'image_compression' ); imagejpeg( $image, $movefile['file'], $quality ); } } return $movefile; } /** * Move temporary files * * run when uploaded files are from custom fields * move them to the users' folder after form submitted * * @param $user_id * @param $files * @param bool $move_only */ function move_temporary_files( $user_id, $files, $move_only = false ) { $new_files = array(); $old_files = array(); $user_basedir = UM()->uploader()->get_upload_user_base_dir( $user_id, true ); foreach ( $files as $key => $filename ) { if ( empty( $filename ) || 'empty_file' == $filename ) { //clear empty filename values $old_filename = get_user_meta( $user_id, $key, true ); if ( ! empty( $old_filename ) ) { $file = $user_basedir . DIRECTORY_SEPARATOR . $old_filename; $valid = true; //validate traversal file if ( validate_file( $file ) === 1 ) { $valid = false; } if ( $valid ) { if ( file_exists( $file ) && um_is_file_owner( $file, $user_id ) ) { unlink( $file ); } } } delete_user_meta( $user_id, $key ); delete_user_meta( $user_id, "{$key}_metadata" ); delete_transient( "um_{$filename}" ); continue; } //move temporary file from temp directory to the correct user directory $temp_file_path = UM()->uploader()->get_core_temp_dir() . DIRECTORY_SEPARATOR . $filename; if ( file_exists( $temp_file_path ) ) { $extra_hash = hash( 'crc32b', time() ); if ( strpos( $filename , 'stream_photo_' ) !== false ) { $new_filename = str_replace("stream_photo_","stream_photo_{$extra_hash}_", $filename ); } else { $new_filename = str_replace("file_","file_{$extra_hash}_", $filename ); } $submitted = get_user_meta( $user_id, 'submitted', true ); $submitted = ( ! empty( $submitted ) && is_array( $submitted ) ) ? $submitted : array(); $submitted[ $key ] = $new_filename; update_user_meta( $user_id, 'submitted', $submitted ); if ( $move_only ) { $file = $user_basedir . DIRECTORY_SEPARATOR . $filename; if ( rename( $temp_file_path, $file ) ) { $new_files[ $key ] = $filename; } } else { $file = $user_basedir . DIRECTORY_SEPARATOR . $new_filename; if ( rename( $temp_file_path, $file ) ) { $new_files[ $key ] = $new_filename; $old_files[ $key ] = get_user_meta( $user_id, $key, true ); update_user_meta( $user_id, $key, $new_filename ); $file_info = get_transient( "um_{$filename}" ); if ( ! $file_info ) { $file_info = get_user_meta( $user_id, "{$key}_metadata_temp", true ); delete_user_meta( $user_id, "{$key}_metadata_temp" ); } if ( $file_info ) { update_user_meta( $user_id, "{$key}_metadata", $file_info ); delete_transient( "um_{$filename}" ); } } } } } /** * @hooked UM()->uploader()->remove_unused_uploads() - 10 */ do_action( 'um_after_move_temporary_files', $user_id, $new_files, $old_files ); } /** * Clean user temp uploads * * @param int $user_id * @param array $new_files * @param array $old_files */ function remove_unused_uploads( $user_id, $new_files, $old_files = array() ) { if ( ! file_exists( $this->get_upload_user_base_dir( $user_id ) ) ) { return; } UM()->user()->remove_cache( $user_id ); UM()->user()->set( $user_id ); $user_meta_keys = UM()->user()->profile; $_array = $new_files; if ( ! empty( UM()->builtin()->custom_fields ) ) { foreach ( UM()->builtin()->custom_fields as $_field ) { if ( ! array_key_exists( 'type', $_field ) ) { continue; } if ( in_array( $_field['type'], array( 'file', 'image' ), true ) && isset( $user_meta_keys[ $_field['metakey'] ] ) && empty( $_array[ $_field['metakey'] ] ) ) { $_array[ $_field['metakey'] ] = $user_meta_keys[ $_field['metakey'] ]; } } } $files = glob( UM()->uploader()->get_upload_base_dir() . $user_id . DIRECTORY_SEPARATOR . '*' ); if ( ! empty( $files ) ) { foreach ( $files as $file ) { $str = basename( $file ); if ( strstr( $str, 'profile_photo' ) || strstr( $str, 'cover_photo' ) || preg_grep( '/' . $str . '/', $_array ) ) { continue; } // Don't delete photo that belongs to the Social Activity post or Groups post if ( strstr( $str, 'stream_photo' ) ) { global $wpdb; $is_post_image = $wpdb->get_var( " SELECT COUNT(*) FROM {$wpdb->postmeta} WHERE `meta_key`='_photo' AND `meta_value`='{$str}';" ); if ( $is_post_image ) { continue; } } $can_unlink = apply_filters( 'um_can_remove_uploaded_file', true, $user_id, $str ); if ( $can_unlink ) { unlink( $file ); } } } } } }