WordPress.org

Make WordPress Core

Ticket #16020: 16020.7.diff

File 16020.7.diff, 15.4 KB (added by cdog, 18 months ago)
  • src/js/_enqueues/admin/user-profile.js

     
    44
    55/* global ajaxurl, pwsL10n, userProfileL10n */
    66(function($) {
    7         var updateLock = false,
     7        var frame,
    88
     9                updateLock = false,
     10
    911                $pass1Row,
    1012                $pass1,
    1113                $pass2,
     
    1618                $submitButton,
    1719                currentPass;
    1820
     21        function calculateImageSelectOptions(attachment, controller) {
     22                var control    = controller.get( 'control' ),
     23                        flexWidth  = !! parseInt( control.params.flex_width, 10 ),
     24                        flexHeight = !! parseInt( control.params.flex_height, 10 ),
     25                        realWidth  = attachment.get( 'width' ),
     26                        realHeight = attachment.get( 'height' ),
     27                        xInit = parseInt( control.params.width, 10 ),
     28                        yInit = parseInt( control.params.height, 10 ),
     29                        ratio = xInit / yInit,
     30                        xImg  = xInit,
     31                        yImg  = yInit,
     32                        x1, y1, imgSelectOptions;
     33
     34                controller.set( 'canSkipCrop', false );
     35
     36                if ( realWidth / realHeight > ratio ) {
     37                        yInit = realHeight;
     38                        xInit = yInit * ratio;
     39                } else {
     40                        xInit = realWidth;
     41                        yInit = xInit / ratio;
     42                }
     43
     44                x1 = ( realWidth - xInit ) / 2;
     45                y1 = ( realHeight - yInit ) / 2;
     46
     47                imgSelectOptions = {
     48                        handles: true,
     49                        keys: true,
     50                        instance: true,
     51                        persistent: true,
     52                        imageWidth: realWidth,
     53                        imageHeight: realHeight,
     54                        minWidth: xImg > xInit ? xInit : xImg,
     55                        minHeight: yImg > yInit ? yInit : yImg,
     56                        x1: x1,
     57                        y1: y1,
     58                        x2: xInit + x1,
     59                        y2: yInit + y1
     60                };
     61
     62                if ( flexHeight === false && flexWidth === false ) {
     63                        imgSelectOptions.aspectRatio = xInit + ':' + yInit;
     64                }
     65
     66                if ( true === flexHeight ) {
     67                        delete imgSelectOptions.minHeight;
     68                        imgSelectOptions.maxWidth = realWidth;
     69                }
     70
     71                if ( true === flexWidth ) {
     72                        delete imgSelectOptions.minWidth;
     73                        imgSelectOptions.maxHeight = realHeight;
     74                }
     75
     76                return imgSelectOptions;
     77        }
     78
     79        $( function() {
     80                /**
     81                 * Opens the 'choose from library' frame and creates it if it doesn't exist.
     82                 *
     83                 * @since 3.5.0
     84                 * @deprecated 4.1.0
     85                 *
     86                 * @return {void}
     87                 */
     88                $('#choose-from-library-link').click( function( event ) {
     89                        var $el = $(this);
     90                        event.preventDefault();
     91
     92                        var cropControl = {
     93                                id: "control-id",
     94                                params : {
     95                                        flex_width : false,
     96                                        flex_height : false,
     97                                        width : 640,
     98                                        height : 640
     99                                }
     100                        };
     101
     102                        // If the media frame already exists, reopen it.
     103                        if ( frame ) {
     104                                frame.open();
     105                                return;
     106                        }
     107
     108                        // Create the media frame.
     109                        frame = wp.media.frames.profilePicture = wp.media({
     110                                // Set the title of the modal.
     111                                title: $el.data('choose'),
     112
     113                                // Tell the modal to show only images.
     114                                library: {
     115                                        type: 'image'
     116                                },
     117
     118                                // Customize the submit button.
     119                                button: {
     120                                        // Set the text of the button.
     121                                        text: $el.data('update'),
     122                                        // Tell the button not to close the modal, since we're
     123                                        // going to refresh the page when the image is selected.
     124                                        close: false
     125                                },
     126
     127                                states: [
     128                                        new wp.media.controller.Library({
     129                                                title: $el.data( 'choose' ),
     130                                                library: wp.media.query({ type: 'image' }),
     131                                                multiple: false,
     132                                                date: false,
     133                                                priority: 20,
     134                                                // suggestedWidth: 200,
     135                                                // suggestedHeight: 200
     136                                        }),
     137                                        new wp.media.controller.CustomizeImageCropper({
     138                                                imgSelectOptions: calculateImageSelectOptions,
     139                                                control: cropControl
     140                                        })
     141                                ]
     142                        });
     143
     144                        frame.on('cropped', function(croppedImage) {
     145                                var link = $el.data('updateLink');
     146
     147                                // Tell the browser to navigate to the crop step.
     148                                window.location = link + '&file=' + croppedImage.id;
     149                        });
     150
     151                        /**
     152                         * Updates the window location to include the selected attachment.
     153                         *
     154                         * @since 3.5.0
     155                         * @deprecated 4.1.0
     156                         *
     157                         * @return {void}
     158                         */
     159                        frame.on( 'select', function() {
     160                                // Grab the selected attachment.
     161                                var attachment = frame.state().get('selection').first();
     162
     163                                frame.setState( 'cropper' );
     164                        });
     165
     166                        frame.open();
     167                });
     168        });
     169
    19170        function generatePassword() {
    20171                if ( typeof zxcvbn !== 'function' ) {
    21172                        setTimeout( generatePassword, 50 );
  • src/wp-admin/includes/misc.php

     
    10111011}
    10121012
    10131013/**
     1014 * Cleanup a custom avatar
     1015 *
     1016 * @since 3.5.1
     1017 * @param int $attachment_id An attachment ID
     1018 */
     1019function unlink_profile_picture( $attachment_id ) {
     1020        $upload_dir = wp_upload_dir();
     1021        $profile_picture = get_post_meta( $attachment_id, '_wp_attachment_profile_picture', true );
     1022
     1023        if ( is_array( $profile_picture ) ) {
     1024                foreach ( $profile_picture as $file ) {
     1025                        if ( ! $file['is_reserved'] ) {
     1026                                $file = str_replace( $upload_dir['baseurl'], $upload_dir['basedir'], $file['url'] );
     1027                                @unlink( $file );
     1028                        }
     1029                }
     1030        }
     1031
     1032        delete_post_meta( $attachment_id, '_wp_attachment_profile_picture' );
     1033        delete_post_meta( $attachment_id, '_wp_attachment_is_profile_picture' );
     1034}
     1035
     1036/**
     1037 * Delete a custom avatar
     1038 *
     1039 * @since 3.5.1
     1040 * @param int $attachment_id An attachment ID
     1041 */
     1042function delete_profile_picture( $attachment_id ) {
     1043        $is_profile_picture = get_post_meta( $attachment_id, '_wp_attachment_is_profile_picture', true );
     1044
     1045        if ( ! $is_profile_picture ) {
     1046                return;
     1047        }
     1048
     1049        unlink_profile_picture( $attachment_id );
     1050
     1051        $args = array(
     1052                'meta_key' => 'profile_picture',
     1053                'meta_value' => $attachment_id
     1054        );
     1055
     1056        $users = get_users( $args );
     1057
     1058        foreach ( $users as $user ) {
     1059                delete_user_meta( $user->ID, 'profile_picture' );
     1060        }
     1061}
     1062
     1063add_action( 'delete_attachment', 'delete_profile_picture' );
     1064
     1065/**
    10141066 * @since 3.3.0
    10151067 */
    10161068function _ipad_meta() {
  • src/wp-admin/includes/template.php

     
    22522252                $media_states[] = __( 'Logo' );
    22532253        }
    22542254
     2255        if ( ! empty( get_post_meta( $post->ID, '_wp_attachment_is_profile_picture', true ) ) ) {
     2256                $media_states[] = __( 'Profile Picture' );
     2257        }
     2258
    22552259        /**
    22562260         * Filters the default media display states for items in the Media list table.
    22572261         *
  • src/wp-admin/user-edit.php

     
    2525        wp_die( __( 'Invalid user ID.' ) );
    2626}
    2727
     28wp_enqueue_media();
    2829wp_enqueue_script( 'user-profile' );
    2930
    3031if ( IS_PROFILE_PAGE ) {
     
    173174                        exit;
    174175                }
    175176
    176                 // Intentional fall-through to display $errors.
     177        case 'set-avatar':
     178                check_admin_referer( 'update-user_' . $user_id );
     179
     180                if ( ! current_user_can( 'edit_user', $user_id ) ) {
     181                        wp_die( __( 'Sorry, you are not allowed to edit this user.' ) );
     182                }
     183
     184                if ( isset( $_GET['file'] ) ) {
     185                        $attachment_id = absint( $_GET['file'] );
     186
     187                        $meta_avatar = get_post_meta( $attachment_id, '_wp_attachment_is_profile_picture', true );
     188
     189                        if ( empty( $meta_avatar ) ) {
     190                                $profile_picture = array();
     191
     192                                update_post_meta( $attachment_id, '_wp_attachment_profile_picture', $profile_picture );
     193                                update_post_meta( $attachment_id, '_wp_attachment_is_profile_picture', true );
     194                        }
     195
     196                        $profile_picture = get_user_meta( $user_id, 'profile_picture', true );
     197
     198                        if ( ! empty( $profile_picture ) && $profile_picture != $attachment_id ) {
     199                                delete_profile_picture( $profile_picture );
     200                        }
     201
     202                        update_user_meta( $user_id, 'profile_picture', $attachment_id );
     203                }
     204
     205                $redirect = add_query_arg( 'updated', true, get_edit_user_link( $user_id ) );
     206
     207                if ( $wp_http_referer ) {
     208                        $redirect = add_query_arg( 'wp_http_referer', urlencode( $wp_http_referer ), $redirect);
     209                }
     210
     211                wp_redirect( $redirect );
     212                exit;
     213
     214        case 'remove-avatar':
     215                check_admin_referer( 'update-user_' . $user_id );
     216
     217                if ( ! current_user_can( 'edit_user', $user_id ) ) {
     218                        wp_die( __( 'Sorry, you are not allowed to edit this user.' ) );
     219                }
     220
     221                $attachment_id = get_user_meta( $user_id, 'profile_picture', true );
     222
     223                unlink_profile_picture( $attachment_id );
     224                delete_user_meta( $user_id, 'profile_picture' );
     225
     226                $redirect = add_query_arg( 'updated', true, get_edit_user_link( $user_id ) );
     227
     228                if ( $wp_http_referer ) {
     229                        $redirect = add_query_arg( 'wp_http_referer', urlencode( $wp_http_referer ), $redirect);
     230                }
     231
     232                wp_redirect( $redirect );
     233                exit;
     234
     235        // Intentional fall-through to display $errors.
    177236        default:
    178237                $profileuser = get_user_to_edit( $user_id );
    179238
     
    577636<tr class="user-profile-picture">
    578637        <th><?php _e( 'Profile Picture' ); ?></th>
    579638        <td>
    580                         <?php echo get_avatar( $user_id ); ?>
     639                <?php echo get_avatar( $user_id ); ?>
    581640                <p class="description">
    582641                        <?php
     642                        $has_profile_picture = isset( $profileuser->profile_picture )
     643                                ? get_post_meta( $profileuser->profile_picture, '_wp_attachment_is_profile_picture', true )
     644                                : false;
     645
    583646                        if ( IS_PROFILE_PAGE ) {
    584                                 $description = sprintf(
    585                                         /* translators: %s: Gravatar URL. */
    586                                         __( '<a href="%s">You can change your profile picture on Gravatar</a>.' ),
    587                                         __( 'https://en.gravatar.com/' )
    588                                 );
     647                                if ( current_user_can( 'upload_files' ) ) {
     648                                        if ( $has_profile_picture ) {
     649                                                $modal_update_href = esc_attr( add_query_arg( array(
     650                                                        'action' => 'set-avatar',
     651                                                        'user_id' => $profileuser->ID
     652                                                ), self_admin_url( IS_PROFILE_PAGE ? 'profile.php' : 'user-edit.php' ) ) );
     653
     654                                                $href = esc_attr( add_query_arg( array(
     655                                                        'action' => 'remove-avatar',
     656                                                        'user_id' => $profileuser->ID
     657                                                ), self_admin_url( IS_PROFILE_PAGE ? 'profile.php' : 'user-edit.php' ) ) );
     658
     659                                                $description = sprintf(
     660                                                        __('<a href="#" data-choose="%s" data-update="%s" data-update-link="%s" id="%s">Change profile picture</a>, or <a href="%s" onclick="%s">remove image</a>'),
     661                                                        __( 'Select image' ),
     662                                                        __( 'Set as profile picture' ),
     663                                                        wp_nonce_url( $modal_update_href, 'update-user_' . $profileuser->ID ),
     664                                                        'choose-from-library-link',
     665                                                        wp_nonce_url( $href, 'update-user_' . $user_id ),
     666                                                        'return showNotice.warn();'
     667                                                );
     668                                        } else {
     669                                                $modal_update_href = esc_attr( add_query_arg( array(
     670                                                        'action' => 'set-avatar',
     671                                                        'user_id' => $profileuser->ID
     672                                                ), self_admin_url( IS_PROFILE_PAGE ? 'profile.php' : 'user-edit.php' ) ) );
     673
     674                                                $description = sprintf(
     675                                                        /* translators: %s: Gravatar URL. */
     676                                                        __( 'You can change your profile picture on <a href="%s" target="_blank">Gravatar</a>, or <a href="#" data-choose="%s" data-update="%s" data-update-link="%s" id="%s">select an image</a>.' ),
     677                                                        __( 'https://en.gravatar.com/' ),
     678                                                        __( 'Select image' ),
     679                                                        __( 'Set as profile picture' ),
     680                                                        wp_nonce_url( $modal_update_href, 'update-user_' . $profileuser->ID ),
     681                                                        'choose-from-library-link'
     682                                                );
     683                                        }
     684                                } else {
     685                                        $description = sprintf(
     686                                                /* translators: %s: Gravatar URL. */
     687                                                __( '<a href="%s">You can change your profile picture on Gravatar</a>.' ),
     688                                                __( 'https://en.gravatar.com/' )
     689                                        );
     690                                }
    589691                        } else {
    590                                 $description = '';
     692                                if ( current_user_can( 'upload_files' ) ) {
     693                                        $description = sprintf(
     694                                                '<a href="#">%s</a>',
     695                                                __( 'Upload profile picture' )
     696                                        );
     697                                } else {
     698                                        $description = '';
     699                                }
    591700                        }
    592701
    593702                        /**
  • src/wp-includes/link-template.php

     
    42094209                }
    42104210        }
    42114211
     4212        if ( ! $user ) {
     4213                if ( $email ) {
     4214                        $user = get_user_by( 'email', $email );
     4215                }
     4216        }
     4217        if ( $user ) {
     4218                $profile_picture = get_post_meta( $user->profile_picture, '_wp_attachment_profile_picture', true );
     4219
     4220                if ( is_array( $profile_picture ) ) {
     4221                        if ( empty( $profile_picture[ $args['size'] ] ) ) {
     4222                                $src = wp_get_attachment_image_src( $user->profile_picture, 'full' );
     4223
     4224                                $profile_picture[ $args['size'] ] = resize_profile_picture( $src[0], $args['size'] );
     4225
     4226                                update_post_meta( $user->profile_picture, '_wp_attachment_profile_picture', $profile_picture );
     4227                        }
     4228
     4229                        $url = $profile_picture[ $args['size'] ]['url'];
     4230
     4231                        /** This filter is documented in wp-includes/link-template.php */
     4232                        $args['url'] = apply_filters( 'get_avatar_url', $url, $id_or_email, $args );
     4233
     4234                        /** This filter is documented in wp-includes/link-template.php */
     4235                        return apply_filters( 'get_avatar_data', $args, $id_or_email );
     4236                }
     4237        }
     4238
    42124239        if ( ! $email_hash ) {
    42134240                if ( $user ) {
    42144241                        $email = $user->user_email;
  • src/wp-includes/media.php

     
    17681768}
    17691769
    17701770/**
     1771 * Resize a custom avatar
     1772 *
     1773 * @since 3.5.1
     1774 * @param string URL to an avatar image to resize
     1775 * @param int Size of the new avatar image
     1776 * @return array Array with the URL of the new avatar image
     1777 */
     1778function resize_profile_picture( $url, $size ) {
     1779        $upload_dir      = wp_upload_dir();
     1780        $file            = str_replace( $upload_dir['baseurl'], $upload_dir['basedir'], $url );
     1781        $info            = pathinfo( $file );
     1782        $dir             = $info['dirname'];
     1783        $ext             = $info['extension'];
     1784        $name            = wp_basename( $file, ".$ext" );
     1785        $suffix          = "{$size}x{$size}";
     1786        $destfilename    = "{$dir}/{$name}-{$suffix}.{$ext}";
     1787        $profile_picture = array();
     1788
     1789        if ( file_exists( $destfilename ) ) {
     1790                $profile_picture['url']  = str_replace( $upload_dir['basedir'], $upload_dir['baseurl'], $destfilename );
     1791                $profile_picture['is_reserved'] = true;
     1792        } else {
     1793                $file = image_resize( $file, $size, $size, true );
     1794
     1795                if ( ! is_wp_error( $file ) ) {
     1796                        $profile_picture['url']  = str_replace( $upload_dir['basedir'], $upload_dir['baseurl'], $file );
     1797                        $profile_picture['is_reserved'] = false;
     1798                }
     1799        }
     1800
     1801        return $profile_picture;
     1802}
     1803
     1804/**
    17711805 * Adds a 'wp-post-image' class to post thumbnails. Internal use only.
    17721806 *
    17731807 * Uses the {@see 'begin_fetch_post_thumbnail_html'} and {@see 'end_fetch_post_thumbnail_html'}
  • src/wp-includes/user.php

     
    17571757         */
    17581758        $meta['description'] = apply_filters( 'pre_user_description', $description );
    17591759
     1760        $meta['profile_picture'] = empty( $userdata['profile_picture'] ) ? '' : $userdata['profile_picture'];
     1761
    17601762        $meta['rich_editing'] = empty( $userdata['rich_editing'] ) ? 'true' : $userdata['rich_editing'];
    17611763
    17621764        $meta['syntax_highlighting'] = empty( $userdata['syntax_highlighting'] ) ? 'true' : $userdata['syntax_highlighting'];
     
    21932195 * @return string[] List of user keys to be populated in wp_update_user().
    21942196 */
    21952197function _get_additional_user_keys( $user ) {
    2196         $keys = array( 'first_name', 'last_name', 'nickname', 'description', 'rich_editing', 'syntax_highlighting', 'comment_shortcuts', 'admin_color', 'use_ssl', 'show_admin_bar_front', 'locale' );
     2198        $keys = array( 'first_name', 'last_name', 'nickname', 'description', 'profile_picture', 'rich_editing', 'syntax_highlighting', 'comment_shortcuts', 'admin_color', 'use_ssl', 'show_admin_bar_front', 'locale' );
    21972199        return array_merge( $keys, array_keys( wp_get_user_contact_methods( $user ) ) );
    21982200}
    21992201