WordPress.org

Make WordPress Core

Ticket #6148: 6148.4.patch

File 6148.4.patch, 15.7 KB (added by Takahashi_Fumiki, 5 weeks ago)

Integrates name fields into full_name and add extra filters.

  • wp-admin/includes/class-wp-users-list-table.php

     
    504504                                                $r .= "$avatar $edit";
    505505                                                break;
    506506                                        case 'name':
    507                                                 if ( $user_object->first_name && $user_object->last_name ) {
    508                                                         $r .= "$user_object->first_name $user_object->last_name";
    509                                                 } elseif ( $user_object->first_name ) {
    510                                                         $r .= $user_object->first_name;
    511                                                 } elseif ( $user_object->last_name ) {
    512                                                         $r .= $user_object->last_name;
    513                                                 } else {
    514                                                         $r .= '<span aria-hidden="true">&#8212;</span><span class="screen-reader-text">' . _x( 'Unknown', 'name' ) . '</span>';
    515                                                 }
     507                                                $r.= $user_object->nickname ?: $user_object->display_name;
    516508                                                break;
    517509                                        case 'email':
    518510                                                $r .= "<a href='" . esc_url( "mailto:$email" ) . "'>$email</a>";
  • wp-admin/includes/user.php

     
    8888                        $user->user_url = preg_match( '/^(' . $protocols . '):/is', $user->user_url ) ? $user->user_url : 'http://' . $user->user_url;
    8989                }
    9090        }
    91         if ( isset( $_POST['first_name'] ) ) {
    92                 $user->first_name = sanitize_text_field( $_POST['first_name'] );
     91        foreach ( wp_get_user_name_parts() as $key => $label ) {
     92                if ( isset( $_POST[ $key ] ) ) {
     93                        $user->{$key} = sanitize_text_field( $_POST[ $key ] );
     94                }
    9395        }
    94         if ( isset( $_POST['last_name'] ) ) {
    95                 $user->last_name = sanitize_text_field( $_POST['last_name'] );
    96         }
    9796        if ( isset( $_POST['nickname'] ) ) {
    9897                $user->nickname = sanitize_text_field( $_POST['nickname'] );
    9998        }
  • wp-admin/user-edit.php

     
    425425</td></tr>
    426426                <?php } ?>
    427427
    428 <tr class="user-first-name-wrap">
    429         <th><label for="first_name"><?php _e( 'First Name' ); ?></label></th>
    430         <td><input type="text" name="first_name" id="first_name" value="<?php echo esc_attr( $profileuser->first_name ); ?>" class="regular-text" /></td>
     428<?php foreach ( wp_get_user_name_parts() as $key => $label ) : ?>
     429<tr class="user-<?php echo esc_attr( str_replace( '_', '-', $key ) ) ?>-wrap">
     430        <th><label for="<?php echo esc_attr( $key ) ?>"><?php echo esc_html( $label ); ?></label></th>
     431        <td><input type="text" name="<?php echo esc_attr( $key ) ?>" id="<?php echo esc_attr( $key ) ?>" value="<?php echo esc_attr( $profileuser->{$key}); ?>" class="regular-text" /></td>
    431432</tr>
     433<?php endforeach; ?>
    432434
    433 <tr class="user-last-name-wrap">
    434         <th><label for="last_name"><?php _e( 'Last Name' ); ?></label></th>
    435         <td><input type="text" name="last_name" id="last_name" value="<?php echo esc_attr( $profileuser->last_name ); ?>" class="regular-text" /></td>
    436 </tr>
    437 
    438435<tr class="user-nickname-wrap">
    439436        <th><label for="nickname"><?php _e( 'Nickname' ); ?> <span class="description"><?php _e( '(required)' ); ?></span></label></th>
    440437        <td><input type="text" name="nickname" id="nickname" value="<?php echo esc_attr( $profileuser->nickname ); ?>" class="regular-text" /></td>
     
    445442        <td>
    446443                <select name="display_name" id="display_name">
    447444                <?php
    448                         $public_display                     = array();
    449                         $public_display['display_nickname'] = $profileuser->nickname;
    450                         $public_display['display_username'] = $profileuser->user_login;
    451 
    452                 if ( ! empty( $profileuser->first_name ) ) {
    453                         $public_display['display_firstname'] = $profileuser->first_name;
     445                $public_display                     = array();
     446                $public_display['display_nickname'] = $profileuser->nickname;
     447                $public_display['display_username'] = $profileuser->user_login;
     448                $user_name = [];
     449                foreach ( array_keys( wp_get_user_name_parts() ) as $key ) {
     450                        if ( ! empty( $profileuser->{$key} ) ) {
     451                                $user_name[] = $profileuser->{$key};
     452                        }
    454453                }
    455 
    456                 if ( ! empty( $profileuser->last_name ) ) {
    457                         $public_display['display_lastname'] = $profileuser->last_name;
     454                if ( $user_name ) {
     455                        $public_display[ 'display_name_parts' ] = implode( wp_user_name_parts_glue( $profileuser ), $user_name );
    458456                }
    459 
    460                 if ( ! empty( $profileuser->first_name ) && ! empty( $profileuser->last_name ) ) {
    461                         $public_display['display_firstlast'] = $profileuser->first_name . ' ' . $profileuser->last_name;
    462                         $public_display['display_lastfirst'] = $profileuser->last_name . ' ' . $profileuser->first_name;
    463                 }
    464 
     457               
    465458                if ( ! in_array( $profileuser->display_name, $public_display ) ) { // Only add this if it isn't duplicated elsewhere
    466459                        $public_display = array( 'display_displayname' => $profileuser->display_name ) + $public_display;
    467460                }
    468461
    469                         $public_display = array_map( 'trim', $public_display );
    470                         $public_display = array_unique( $public_display );
     462                $public_display = array_map( 'trim', $public_display );
     463                $public_display = array_unique( $public_display );
    471464
    472465                foreach ( $public_display as $id => $item ) {
    473466                        ?>
  • wp-admin/user-new.php

     
    453453        $creating = isset( $_POST['createuser'] );
    454454
    455455        $new_user_login             = $creating && isset( $_POST['user_login'] ) ? wp_unslash( $_POST['user_login'] ) : '';
    456         $new_user_firstname         = $creating && isset( $_POST['first_name'] ) ? wp_unslash( $_POST['first_name'] ) : '';
    457         $new_user_lastname          = $creating && isset( $_POST['last_name'] ) ? wp_unslash( $_POST['last_name'] ) : '';
    458456        $new_user_email             = $creating && isset( $_POST['email'] ) ? wp_unslash( $_POST['email'] ) : '';
    459457        $new_user_uri               = $creating && isset( $_POST['url'] ) ? wp_unslash( $_POST['url'] ) : '';
    460458        $new_user_role              = $creating && isset( $_POST['role'] ) ? wp_unslash( $_POST['role'] ) : '';
    461459        $new_user_send_notification = $creating && ! isset( $_POST['send_user_notification'] ) ? false : true;
    462460        $new_user_ignore_pass       = $creating && isset( $_POST['noconfirmation'] ) ? wp_unslash( $_POST['noconfirmation'] ) : '';
    463 
     461        $new_user_name_parts        = [];
     462        foreach ( wp_get_user_name_parts() as $user_name_key => $label ) {
     463                $new_user_name_parts[] = [
     464                        'key'   => $user_name_key,
     465                        'value' => $creating && isset( $_POST[ $user_name_key ] ) ? wp_unslash( $_POST[ $user_name_key ] ) : '',
     466                        'label' => $label,
     467                ];
     468        }
    464469        ?>
    465470<table class="form-table" role="presentation">
    466471        <tr class="form-field form-required">
     
    472477                <td><input name="email" type="email" id="email" value="<?php echo esc_attr( $new_user_email ); ?>" /></td>
    473478        </tr>
    474479        <?php if ( ! is_multisite() ) { ?>
     480                <?php foreach ( $new_user_name_parts as $name_part ) : ?>
     481                        <tr class="form-field">
     482                                <th scope="row">
     483                                        <label for="<?php echo esc_attr( $name_part['key'] ) ?>"><?php echo esc_html( $name_part['label'] ); ?> </label>
     484                                </th>
     485                                <td>
     486                                        <input name="<?php echo esc_attr( $name_part['key'] ) ?>" type="text" id="<?php echo esc_attr( $name_part['key'] ) ?>" value="<?php echo esc_attr( $name_part['value'] ); ?>"/>
     487                                </td>
     488                        </tr>
     489                <?php endforeach; ?>
    475490        <tr class="form-field">
    476                 <th scope="row"><label for="first_name"><?php _e( 'First Name' ); ?> </label></th>
    477                 <td><input name="first_name" type="text" id="first_name" value="<?php echo esc_attr( $new_user_firstname ); ?>" /></td>
    478         </tr>
    479         <tr class="form-field">
    480                 <th scope="row"><label for="last_name"><?php _e( 'Last Name' ); ?> </label></th>
    481                 <td><input name="last_name" type="text" id="last_name" value="<?php echo esc_attr( $new_user_lastname ); ?>" /></td>
    482         </tr>
    483         <tr class="form-field">
    484491                <th scope="row"><label for="url"><?php _e( 'Website' ); ?></label></th>
    485492                <td><input name="url" type="url" id="url" class="code" value="<?php echo esc_attr( $new_user_uri ); ?>" /></td>
    486493        </tr>
  • wp-includes/user.php

     
    16291629         */
    16301630        $user_email = apply_filters( 'pre_user_email', $raw_user_email );
    16311631
    1632         /*
    1633          * If there is no update, just check for `email_exists`. If there is an update,
    1634          * check if current email and new email are the same, or not, and check `email_exists`
    1635          * accordingly.
    1636          */
    1637         if ( ( ! $update || ( ! empty( $old_user_data ) && 0 !== strcasecmp( $user_email, $old_user_data->user_email ) ) )
    1638                 && ! defined( 'WP_IMPORTING' )
    1639                 && email_exists( $user_email )
    1640         ) {
    1641                 return new WP_Error( 'existing_user_email', __( 'Sorry, that email address is already used!' ) );
     1632        foreach ( wp_get_user_name_parts() as $name_key => $label ) {
     1633                $name_part = empty( $userdata[ $name_key ] ) ? '' : $userdata[ $name_key ];
     1634                /**
     1635                 * Filters a user's name part before the user is created or updated.
     1636                 *
     1637                 * This filter is backward compatibility for 'pre_user_first_name' and 'pre_user_last_name'.
     1638                 *
     1639                 * @since 5.3.0
     1640                 *
     1641                 * @param string $name_part The user's
     1642                 */
     1643                $meta[ $name_key ] = apply_filters( "pre_user_{$name_key}", $name_part );
     1644                /**
     1645                 * Filters a user's name part before the user is created or updated.
     1646                 *
     1647                 * @since 5.3.0
     1648                 *
     1649                 * @param string $name_part_value The user's name part value. e.g. "John"
     1650                 * @param string $name_part_name  The user's name part key.   e.g. "first_name"
     1651                 * @param array  $userdata        User data array.
     1652                 * @param bool   $update          If updating, true.
     1653                 */
     1654                $meta[ $name_key ] = apply_filters( "pre_user_name_part", $name_part, $name_key, $userdata, $update );
    16421655        }
    1643         $nickname = empty( $userdata['nickname'] ) ? $user_login : $userdata['nickname'];
    16441656
    1645         /**
    1646          * Filters a user's nickname before the user is created or updated.
    1647          *
    1648          * @since 2.0.3
    1649          *
    1650          * @param string $nickname The user's nickname.
    1651          */
    1652         $meta['nickname'] = apply_filters( 'pre_user_nickname', $nickname );
    1653 
    1654         $first_name = empty( $userdata['first_name'] ) ? '' : $userdata['first_name'];
    1655 
    1656         /**
    1657          * Filters a user's first name before the user is created or updated.
    1658          *
    1659          * @since 2.0.3
    1660          *
    1661          * @param string $first_name The user's first name.
    1662          */
    1663         $meta['first_name'] = apply_filters( 'pre_user_first_name', $first_name );
    1664 
    1665         $last_name = empty( $userdata['last_name'] ) ? '' : $userdata['last_name'];
    1666 
    1667         /**
    1668          * Filters a user's last name before the user is created or updated.
    1669          *
    1670          * @since 2.0.3
    1671          *
    1672          * @param string $last_name The user's last name.
    1673          */
    1674         $meta['last_name'] = apply_filters( 'pre_user_last_name', $last_name );
    1675 
    16761657        if ( empty( $userdata['display_name'] ) ) {
    16771658                if ( $update ) {
    16781659                        $display_name = $user_login;
    1679                 } elseif ( $meta['first_name'] && $meta['last_name'] ) {
    1680                         /* translators: 1: first name, 2: last name */
    1681                         $display_name = sprintf( _x( '%1$s %2$s', 'Display name based on first name and last name' ), $meta['first_name'], $meta['last_name'] );
    1682                 } elseif ( $meta['first_name'] ) {
    1683                         $display_name = $meta['first_name'];
    1684                 } elseif ( $meta['last_name'] ) {
    1685                         $display_name = $meta['last_name'];
    16861660                } else {
    1687                         $display_name = $user_login;
     1661                        // Try building non empty name.
     1662                        $generated_name = [];
     1663                        foreach ( array_keys( wp_get_user_name_parts() ) as $name_part_key ) {
     1664                                if ( ! empty( $userdata[ $name_part_key ]) ) {
     1665                                        $generated_name[] = $userdata[ $name_part_key ];
     1666                                }
     1667                        }
     1668                        $display_name = $generated_name ? implode( wp_user_name_parts_glue( $userdata ), $generated_name ) : $user_login;
    16881669                }
    16891670        } else {
    16901671                $display_name = $userdata['display_name'];
     
    16981679         * @param string $display_name The user's display name.
    16991680         */
    17001681        $display_name = apply_filters( 'pre_user_display_name', $display_name );
     1682       
     1683        /*
     1684         * If there is no update, just check for `email_exists`. If there is an update,
     1685         * check if current email and new email are the same, or not, and check `email_exists`
     1686         * accordingly.
     1687         */
     1688        if ( ( ! $update || ( ! empty( $old_user_data ) && 0 !== strcasecmp( $user_email, $old_user_data->user_email ) ) )
     1689                 && ! defined( 'WP_IMPORTING' )
     1690                 && email_exists( $user_email )
     1691        ) {
     1692                return new WP_Error( 'existing_user_email', __( 'Sorry, that email address is already used!' ) );
     1693        }
     1694        $nickname = empty( $userdata['nickname'] ) ? $display_name : $userdata['nickname'];
     1695       
     1696        /**
     1697         * Filters a user's nickname before the user is created or updated.
     1698         *
     1699         * @since 2.0.3
     1700         *
     1701         * @param string $nickname The user's nickname.
     1702         */
     1703        $meta['nickname'] = apply_filters( 'pre_user_nickname', $nickname );
    17011704
    17021705        $description = empty( $userdata['description'] ) ? '' : $userdata['description'];
    17031706
     
    21312134 */
    21322135function _get_additional_user_keys( $user ) {
    21332136        $keys = array( 'first_name', 'last_name', 'nickname', 'description', 'rich_editing', 'syntax_highlighting', 'comment_shortcuts', 'admin_color', 'use_ssl', 'show_admin_bar_front', 'locale' );
    2134         return array_merge( $keys, array_keys( wp_get_user_contact_methods( $user ) ) );
     2137        return array_merge( $keys, array_keys( wp_get_user_name_parts() ), array_keys( wp_get_user_contact_methods( $user ) ) );
    21352138}
    21362139
    21372140/**
     2141 * Get user name parts.
     2142 *
     2143 * Default name parts are first_name and last_name.
     2144 *
     2145 * @since 5.3.0
     2146 *
     2147 * @return array An associative array consists of user_meta key as key and label as value.
     2148 */
     2149function wp_get_user_name_parts() {
     2150        $available_name_parts = [
     2151                'first_name'  => __( 'First Name' ),
     2152                'middle_name' => __( 'Middle Name' ),
     2153                'last_name'   => __( 'Last Name' ),
     2154                'full_name'   => __( 'Full Name' ),
     2155        ];
     2156        $user_locale = get_user_locale();
     2157        /**
     2158         * Filters user name parts.
     2159         *
     2160         * @since 5.3.0
     2161         *
     2162         * @param array  $available_name_parts  An associative array consists of user_meta key as key and label as value.
     2163         * @param string $user_locale User locale
     2164         */
     2165        $available_name_parts = (array) apply_filters( 'user_name_parts', $available_name_parts, $user_locale );
     2166        /*
     2167         * translators: Control name order in your locale. If last name precedes first name, 'last_name,first_name'.
     2168         * A middle name is required, 'first_name,middle_name,last_name'.
     2169         * Other name parts can be added by user_name_parts filters.
     2170         */
     2171        if ( /*$version_is_too_old*/ false ) {
     2172                $name_order = _x( 'first_name,last_name', 'Name order. Do not translate!' );
     2173        } else {
     2174                $name_order = _x( 'full_name', 'Default name order since 5.3.0. Do not translate!' );
     2175        }
     2176        /**
     2177         * Order of user name parts. Must be included in name parts.
     2178         *
     2179         * @since 5.3.0
     2180         *
     2181         * @param array  $name_order  An array of user_meta key.
     2182         * @param string $user_locale User locale.
     2183         */
     2184        $name_order = (array) apply_filters( 'user_name_parts_order', array_map( 'trim', explode( ',', $name_order ) ), $user_locale );
     2185        $name_order = array_filter( $name_order, function( $key ) use ( $available_name_parts ) {
     2186                return ! empty( $available_name_parts[ $key ] );
     2187        } );
     2188        $allowed_parts = [];
     2189        foreach ( $name_order as $key ) {
     2190                $allowed_parts[ $key ] = $available_name_parts[ $key ];
     2191        }
     2192        return empty( $allowed_parts ) ? [
     2193                'full_name'  => __( 'Full Name' ),
     2194        ] : $allowed_parts;
     2195}
     2196
     2197/**
     2198 * Return glue for name parts.
     2199 *
     2200 * @param null|WP_User|array $userdata
     2201 * @return string
     2202 */
     2203function wp_user_name_parts_glue( $userdata = null ) {
     2204        $glue = _x( ' ', 'User name parts glue. Do not translate!' );
     2205        /**
     2206         * Filters the glue of name parts.
     2207         *
     2208         * @param string             $glue     Default ' '.
     2209         * @param array|null|WP_User $userdata User data. Varies depending on context.
     2210         *
     2211         * @since 5.3.0
     2212         *
     2213         * @param string              $glue
     2214         * @param array|array|WP_User $userdata
     2215         */
     2216        return (string) apply_filters( 'default_user_display_name_glue', $glue, $userdata );
     2217}
     2218
     2219/**
    21382220 * Set up the user contact methods.
    21392221 *
    21402222 * Default contact methods were removed in 3.6. A filter dictates contact methods.