WordPress.org

Make WordPress Core

Ticket #43869: 43869.diff

File 43869.diff, 2.2 KB (added by flixos90, 18 months ago)
  • src/wp-includes/l10n.php

     
    8787 * @return string The locale of the user.
    8888 */
    8989function get_user_locale( $user_id = 0 ) {
    90         $user = false;
    91         if ( 0 === $user_id && function_exists( 'wp_get_current_user' ) ) {
    92                 $user = wp_get_current_user();
    93         } elseif ( $user_id instanceof WP_User ) {
    94                 $user = $user_id;
    95         } elseif ( $user_id && is_numeric( $user_id ) ) {
    96                 $user = get_user_by( 'id', $user_id );
     90        global $current_user;
     91
     92        if ( empty( $user_id ) ) {
     93                // Do not initialize the current user if it's not already set through the bootstrap process.
     94                if ( isset( $current_user ) || did_action( 'set_current_user' ) || doing_action( 'init' ) || did_action( 'init' ) ) {
     95                        $user_id = get_current_user_id();
     96                } else {
     97
     98                        /** This filter is documented in wp-includes/user.php */
     99                        $user_id = apply_filters( 'determine_current_user', false );
     100                }
     101        }
     102
     103        if ( $user_id instanceof WP_User ) {
     104                $user_id = $user_id->ID;
    97105        }
    98106
    99         if ( ! $user ) {
     107        if ( ! $user_id ) {
    100108                return get_locale();
    101109        }
    102110
    103         $locale = $user->locale;
     111        $locale = get_user_meta( $user_id, 'locale', true );
    104112        return $locale ? $locale : get_locale();
    105113}
    106114
  • tests/phpunit/tests/l10n/getUserLocale.php

     
    136136                $user_locale = get_user_locale( 'string' );
    137137                $this->assertSame( get_locale(), $user_locale );
    138138        }
     139
     140        /**
     141         * @ticket 43869
     142         */
     143        public function test_get_user_locale_does_not_initialize_current_user_early() {
     144                global $wp_actions;
     145
     146                unset( $wp_actions['set_current_user'], $wp_actions['init'], $GLOBALS['current_user'] );
     147                remove_all_filters( 'determine_current_user' );
     148                add_filter( 'determine_current_user', array( $this, 'get_test_user_id' ) );
     149
     150                $user_locale = get_user_locale();
     151
     152                $this->assertNull( $GLOBALS['current_user'] );
     153                $this->assertSame( 'de_DE', $user_locale );
     154        }
     155
     156        public function get_test_user_id() {
     157                return $this->user_id;
     158        }
    139159}