wpua_is_author_or_above() || ( 1 == (bool) $wpua_allow_upload && is_user_logged_in() ) ) { // Profile functions and scripts add_action( 'show_user_profile', array( $this, 'wpua_maybe_show_user_profile' ) ); add_action( 'edit_user_profile', array( $this, 'wpua_maybe_show_user_profile' ) ); add_action( 'personal_options_update', array( $this, 'wpua_action_process_option_update' ) ); add_action( 'edit_user_profile_update', array( $this, 'wpua_action_process_option_update' ) ); add_action( 'user_new_form', array( $this, 'wpua_action_show_user_profile' ) ); add_action( 'user_register', array( $this, 'wpua_action_process_option_update' ) ); add_filter( 'user_profile_picture_description', array( $this, 'wpua_description_show_user_profile' ), PHP_INT_MAX, 2 ); // Admin scripts $pages = array( 'profile.php', 'options-discussion.php', 'user-edit.php', 'user-new.php', 'admin.php' ); if ( in_array( $pagenow, $pages ) || $wpua_admin->wpua_is_menu_page() ) { add_action( 'admin_enqueue_scripts', array( $this, 'wpua_media_upload_scripts' ) ); } // Front pages if ( ! is_admin() ) { add_action( 'show_user_profile', array( 'wp_user_avatar', 'wpua_media_upload_scripts' ) ); add_action( 'edit_user_profile', array( 'wp_user_avatar', 'wpua_media_upload_scripts' ) ); } if ( ! $this->wpua_is_author_or_above() ) { // Upload errors add_action( 'user_profile_update_errors', array( $this, 'wpua_upload_errors' ), 10, 3 ); // Prefilter upload size add_filter( 'wp_handle_upload_prefilter', array( $this, 'wpua_handle_upload_prefilter' ) ); } } add_filter( 'media_view_settings', array( $this, 'wpua_media_view_settings' ), 10, 1 ); } /** * Avatars have no parent posts * * @param array $settings * * @return array * @uses object $post * @uses bool $wpua_is_profile * @uses is_admin() * array $settings * @since 1.8.4 */ public function wpua_media_view_settings( $settings ) { global $post, $wpua_is_profile; // Get post ID so not to interfere with media uploads $post_id = is_object( $post ) ? $post->ID : 0; // Don't use post ID on front pages if there's a WPUA uploader $settings['post']['id'] = ( ! is_admin() && 1 == $wpua_is_profile ) ? 0 : $post_id; return $settings; } /** * Media Uploader * @since 1.4 * @param object $user * @uses object $current_user * @uses string $mustache_admin * @uses string $pagenow * @uses object $post * @uses bool $show_avatars * @uses object $wp_user_avatar * @uses object $wpua_admin * @uses object $wpua_functions * @uses bool $wpua_is_profile * @uses int $wpua_upload_size_limit * @uses get_user_by() * @uses wp_enqueue_script() * @uses wp_enqueue_media() * @uses wp_enqueue_style() * @uses wp_localize_script() * @uses wp_max_upload_size() * @uses wpua_get_avatar_original() * @uses wpua_is_author_or_above() * @uses wpua_is_menu_page() */ public static function wpua_media_upload_scripts( $user = '' ) { global $current_user, $mustache_admin, $pagenow, $plugin_page, $post, $show_avatars, $wp_user_avatar, $wpua_force_file_uploader, $wpua_admin, $wpua_functions, $wpua_is_profile, $wpua_upload_size_limit; // This is a profile page $wpua_is_profile = 1; $user = ( $pagenow == 'user-edit.php' && isset( $_GET['user_id'] ) ) ? get_user_by( 'id', absint( $_GET['user_id'] ) ) : $current_user; wp_enqueue_style( 'wp-user-avatar', WPUA_CSS_URL . 'wp-user-avatar.css', '', WPUA_VERSION ); wp_enqueue_script( 'jquery' ); if ( ( $wp_user_avatar->wpua_is_author_or_above() && ! $wpua_force_file_uploader ) || 'options-discussion.php' == $pagenow ) { wp_enqueue_script( 'admin-bar' ); wp_enqueue_media( array( 'post' => $post ) ); wp_enqueue_script( 'wp-user-avatar', WPUA_JS_URL . 'wp-user-avatar.js', array( 'jquery', 'media-editor' ), WPUA_VERSION, true ); } else { wp_enqueue_script( 'wp-user-avatar', WPUA_JS_URL . 'wp-user-avatar-user.js', array( 'jquery' ), WPUA_VERSION, true ); } // Admin scripts if ( 'options-discussion.php' == $pagenow || $wpua_admin->wpua_is_menu_page() ) { wp_localize_script( 'wp-user-avatar', 'wpua_custom', array( 'avatar_thumb' => $mustache_admin, ) ); } if ( 'options-discussion.php' == $pagenow || $wpua_admin->wpua_is_menu_page() || ( 'admin.php' == $pagenow && isset( $plugin_page ) && 'wp-user-avatar-library' == $plugin_page ) ) { // Settings control wp_enqueue_script( 'wp-user-avatar-admin', WPUA_JS_URL . 'wp-user-avatar-admin.js', array( 'wp-user-avatar' ), WPUA_VERSION, true ); wp_localize_script( 'wp-user-avatar-admin', 'wpua_admin', array( 'upload_size_limit' => $wpua_upload_size_limit, 'max_upload_size' => wp_max_upload_size(), ) ); } else { // Original user avatar $avatar_medium_src = 1 == (bool) $show_avatars ? $wpua_functions->wpua_get_avatar_original( $user->user_email, 'medium' ) : includes_url() . 'images/blank.gif'; wp_localize_script( 'wp-user-avatar', 'wpua_custom', array( 'avatar_thumb' => $avatar_medium_src, ) ); } } public static function wpua_core_show_user_profile( $user ) { global $blog_id, $current_user, $show_avatars, $wpdb, $wp_user_avatar, $wpua_force_file_uploader, $wpua_edit_avatar, $wpua_functions, $wpua_upload_size_limit_with_units; $has_wp_user_avatar = has_wp_user_avatar( @$user->ID ); // Get WPUA attachment ID $wpua = get_user_meta( @$user->ID, $wpdb->get_blog_prefix( $blog_id ) . 'user_avatar', true ); // Show remove button if WPUA is set $hide_remove = ! $has_wp_user_avatar ? 'wpua-hide' : ''; // Hide image tags if show avatars is off $hide_images = ! $has_wp_user_avatar && 0 == (bool) $show_avatars ? 'wpua-no-avatars' : ''; // If avatars are enabled, get original avatar image or show blank $avatar_medium_src = 1 == (bool) $show_avatars ? $wpua_functions->wpua_get_avatar_original( @$user->user_email, 'medium' ) : includes_url() . 'images/blank.gif'; // Check if user has wp_user_avatar, if not show image from above $avatar_medium = $has_wp_user_avatar ? get_wp_user_avatar_src( $user->ID, 'medium' ) : $avatar_medium_src; // Check if user has wp_user_avatar, if not show image from above $avatar_thumbnail = $has_wp_user_avatar ? get_wp_user_avatar_src( $user->ID, 96 ) : $avatar_medium_src; $edit_attachment_link = esc_url( add_query_arg( array( 'post' => $wpua, 'action' => 'edit', ), admin_url( 'post.php' ) ) ); ?> wpua_is_author_or_above() && ! $wpua_force_file_uploader ) : // Button to launch Media Uploader ?>

wpua_is_author_or_above() || $wpua_force_file_uploader ) : // Upload button ?>

jpg jpeg png gif' ); ?>

<?php echo esc_attr( __( 'Original Size', 'one-user-avatar' ) ); ?>

<?php echo esc_attr( __( 'Thumbnail', 'one-user-avatar' ) ); ?>

wpua_action_show_user_profile( $user ); } // setting defaults for the filter callback fixes an error like https://wordpress.org/support/topic/error-missing-argument-2-for-wp_user_avatarclosure // see https://stackoverflow.com/questions/37779680/missing-argument-2-for-a-custom-function public function wpua_description_show_user_profile( $description = '', $profileuser = null ) { ob_start(); echo wp_specialchars_decode( wp_kses( '', array( 'style' => array(), ) ) ); self::wpua_core_show_user_profile( $profileuser ); return ob_get_clean(); } /** * Add upload error messages * @since 1.7.1 * @param array $errors * @param bool $update * @param object $user * @uses int $wpua_upload_size_limit * @uses add() * @uses wp_upload_dir() */ public static function wpua_upload_errors( $errors, $update, $user ) { global $wpua_upload_size_limit; if ( $update && ! empty( $_FILES['wpua-file'] ) ) { $file = $_FILES['wpua-file']; $size = isset( $file['size'] ) ? absint( $file['size'] ) : 0; $type = isset( $file['type'] ) ? sanitize_mime_type( $file['type'] ) : ''; $upload_dir = wp_upload_dir(); // Allow only JPG, GIF, PNG if ( ! empty( $type ) && ! preg_match( '/(jpe?g|gif|png)$/i', $type ) ) { $errors->add( 'wpua_file_type', __( 'This file is not an image. Please try another.', 'one-user-avatar' ) ); } // Upload size limit if ( ! empty( $size ) && $size > $wpua_upload_size_limit ) { $errors->add( 'wpua_file_size', __( 'Memory exceeded. Please try another smaller file.', 'one-user-avatar' ) ); } // Check if directory is writeable if ( ! is_writeable( $upload_dir['path'] ) ) { $errors->add( 'wpua_file_directory', sprintf( /* translators: directory path */ __( 'Unable to create directory %s. Is its parent directory writable by the server?', 'one-user-avatar' ), $upload_dir['path'] ) ); } } } /** * Set upload size limit * @since 1.5 * @param object $file * @uses int $wpua_upload_size_limit * @uses add_action() * @return object $file */ public function wpua_handle_upload_prefilter( $file ) { global $wpua_upload_size_limit; $size = absint( $file['size'] ); if ( ! empty( $size ) && $size > $wpua_upload_size_limit ) { /** * Error handling that only appears on front pages * @since 1.7 */ function wpua_file_size_error( $errors, $update, $user ) { $errors->add( 'wpua_file_size', __( 'Memory exceeded. Please try another smaller file.', 'one-user-avatar' ) ); } add_action( 'user_profile_update_errors', 'wpua_file_size_error', 10, 3 ); return; } return $file; } /** * Update user meta * @since 1.4 * @param int $user_id * @uses int $blog_id * @uses object $post * @uses object $wpdb * @uses object $wp_user_avatar * @uses bool $wpua_resize_crop * @uses int $wpua_resize_h * @uses bool $wpua_resize_upload * @uses int $wpua_resize_w * @uses add_post_meta() * @uses delete_metadata() * @uses get_blog_prefix() * @uses is_wp_error() * @uses update_post_meta() * @uses update_user_meta() * @uses wp_delete_attachment() * @uses wp_generate_attachment_metadata() * @uses wp_get_image_editor() * @uses wp_handle_upload() * @uses wp_insert_attachment() * @uses WP_Query() * @uses wp_read_image_metadata() * @uses wp_reset_query() * @uses wp_update_attachment_metadata() * @uses wp_upload_dir() * @uses wpua_is_author_or_above() * @uses object $wpua_admin * @uses wpua_has_gravatar() */ public static function wpua_action_process_option_update( $user_id ) { global $blog_id, $post, $wpdb, $wp_user_avatar, $wpua_force_file_uploader, $wpua_resize_crop, $wpua_resize_h, $wpua_resize_upload, $wpua_resize_w, $wpua_admin; // Check if user has publish_posts capability if ( $wp_user_avatar->wpua_is_author_or_above() && ! $wpua_force_file_uploader ) { $wpua_id = isset( $_POST['wp-user-avatar'] ) ? absint( $_POST['wp-user-avatar'] ) : 0; // Remove old attachment postmeta delete_metadata( 'post', null, '_wp_attachment_wp_user_avatar', $user_id, true ); // Create new attachment postmeta add_post_meta( $wpua_id, '_wp_attachment_wp_user_avatar', $user_id ); // Update usermeta update_user_meta( $user_id, $wpdb->get_blog_prefix( $blog_id ) . 'user_avatar', $wpua_id ); } else { // Remove attachment info if avatar is blank if ( isset( $_POST['wp-user-avatar'] ) && empty( $_POST['wp-user-avatar'] ) ) { // Delete other uploads by user $q = array( 'author' => $user_id, 'post_type' => 'attachment', 'post_status' => 'inherit', 'posts_per_page' => '-1', 'meta_query' => array( array( 'key' => '_wp_attachment_wp_user_avatar', 'value' => "", 'compare' => '!=' ), ), ); $avatars_wp_query = new WP_Query( $q ); while( $avatars_wp_query->have_posts() ) { $avatars_wp_query->the_post(); wp_delete_attachment( $post->ID ); } wp_reset_query(); // Remove attachment postmeta delete_metadata( 'post', null, '_wp_attachment_wp_user_avatar', $user_id, true ); // Remove usermeta update_user_meta( $user_id, $wpdb->get_blog_prefix( $blog_id ) . 'user_avatar', '' ); } // Create attachment from upload if ( isset( $_POST['submit'] ) && $_POST['submit'] && ! empty( $_FILES['wpua-file'] ) ) { $file = $_FILES['wpua-file']; $name = isset( $file['name'] ) ? sanitize_file_name( $file['name'] ) : ''; $type = isset( $file['type'] ) ? sanitize_mime_type( $file['type'] ) : ''; $file = wp_handle_upload( $file, array( 'test_form' => false, ) ); if ( isset( $file['url'] ) ) { if ( ! empty( $type ) && preg_match( '/(jpe?g|gif|png)$/i' , $type ) ) { // Resize uploaded image if ( 1 == (bool) $wpua_resize_upload ) { // Original image $uploaded_image = wp_get_image_editor( $file['file'] ); // Check for errors if ( ! is_wp_error( $uploaded_image ) ) { // Resize image $uploaded_image->resize( $wpua_resize_w, $wpua_resize_h, $wpua_resize_crop ); // Save image $uploaded_image->save( $file['file'] ); } } // Break out file info $name_parts = pathinfo( $name ); $name = trim( substr( $name, 0, -( 1 + strlen( $name_parts['extension'] ) ) ) ); $url = $file['url']; $file = $file['file']; $title = $name; // Use image exif/iptc data for title if possible if ( $image_meta = @wp_read_image_metadata( $file ) ) { if ( trim( $image_meta['title'] ) && ! is_numeric( sanitize_title( $image_meta['title'] ) ) ) { $title = $image_meta['title']; } } // Construct the attachment array $attachment = array( 'guid' => $url, 'post_mime_type' => $type, 'post_title' => $title, 'post_content' => '', ); // This should never be set as it would then overwrite an existing attachment if ( isset( $attachment['ID'] ) ) { unset( $attachment['ID'] ); } // Save the attachment metadata $attachment_id = wp_insert_attachment( $attachment, $file ); if ( ! is_wp_error( $attachment_id ) ) { // Delete other uploads by user $q = array( 'author' => $user_id, 'post_type' => 'attachment', 'post_status' => 'inherit', 'posts_per_page' => '-1', 'meta_query' => array( array( 'key' => '_wp_attachment_wp_user_avatar', 'value' => '', 'compare' => '!=', ), ), ); $avatars_wp_query = new WP_Query( $q ); while ( $avatars_wp_query->have_posts() ){ $avatars_wp_query->the_post(); wp_delete_attachment($post->ID); } wp_reset_query(); wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $file ) ); // Remove old attachment postmeta delete_metadata( 'post', null, '_wp_attachment_wp_user_avatar', $user_id, true ); // Create new attachment postmeta update_post_meta( $attachment_id, '_wp_attachment_wp_user_avatar', $user_id ); // Update usermeta update_user_meta( $user_id, $wpdb->get_blog_prefix( $blog_id ) . 'user_avatar', $attachment_id ); } } } } } } /** * Check attachment is owned by user * @since 1.4 * @param int $attachment_id * @param int $user_id * @param bool $wpua_author * @uses get_post() * @return bool */ private function wpua_author( $attachment_id, $user_id, $wpua_author = 0 ) { $attachment = get_post( $attachment_id ); if ( ! empty( $attachment ) && $attachment->post_author == $user_id ) { $wpua_author = true; } return (bool) $wpua_author; } /** * Check if current user has at least Author privileges * @since 1.8.5 * @uses current_user_can() * @uses apply_filters() * @return bool */ public function wpua_is_author_or_above() { $is_author_or_above = ( current_user_can( 'edit_published_posts' ) && current_user_can( 'upload_files' ) && current_user_can( 'publish_posts') && current_user_can( 'delete_published_posts') ) ? true : false; /** * Filter Author privilege check * @since 1.9.2 * @param bool $is_author_or_above */ return (bool) apply_filters( 'wpua_is_author_or_above', $is_author_or_above ); } } /** * Initialize WP_User_Avatar * @since 1.8 */ function wpua_init() { global $wp_user_avatar; if ( ! isset( $wp_user_avatar ) ) { $wp_user_avatar = new WP_User_Avatar(); } return $wp_user_avatar; } add_action( 'init', 'wpua_init' );