Make WordPress Core

Changeset 38976


Ignore:
Timestamp:
10/27/2016 03:42:09 AM (5 years ago)
Author:
pento
Message:

I18N: Fix a PHP fatal when get_locale() is called before $wpdb is ready.

If WPDB needs to bail early, it loads the translations, which need to load the locale. Without WPDB, we can't get any database options, so can only rely on what's been loaded so far.

Fixes #29783.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/l10n.php

    r38961 r38976  
    2929 */
    3030function get_locale() {
    31     global $locale, $wp_local_package;
     31    global $locale, $wp_local_package, $wpdb;
    3232
    3333    if ( isset( $locale ) ) {
     
    4949    if ( defined( 'WPLANG' ) ) {
    5050        $locale = WPLANG;
     51    }
     52
     53    // If $wpdb hasn't been initialised yet, we can only return what we have.
     54    if ( ! $wpdb ) {
     55        if ( ! $locale ) {
     56            return 'en_US';
     57        }
     58
     59        return $locale;
    5160    }
    5261
  • trunk/tests/phpunit/tests/l10n/getLocale.php

    r36741 r38976  
    8282    }
    8383
     84    public function test_should_fall_back_on_locale_when_wpdb_is_unavailable() {
     85        global $locale, $wpdb;
     86
     87        $old_locale = $locale;
     88        $old_wpdb = $wpdb;
     89
     90        $locale = $expected = "Is this a locale? No. No it isn't.";
     91        $wpdb = null;
     92
     93        $found = get_locale();
     94
     95        $locale = $old_locale;
     96        $wpdb = $old_wpdb;
     97
     98        $this->assertSame( $expected, $found );
     99    }
     100
     101    public function test_should_fall_back_on_es_US_when_locale_and_wpdb_are_unavailable() {
     102        global $locale, $wpdb;
     103
     104        $old_locale = $locale;
     105        $old_wpdb = $wpdb;
     106
     107        $locale = null;
     108        $wpdb = null;
     109
     110        $found = get_locale();
     111
     112        $locale = $old_locale;
     113        $wpdb = $old_wpdb;
     114
     115        $this->assertSame( 'en_US', $found );
     116    }
     117
    84118    public function test_should_respect_get_locale_filter() {
    85119        add_filter( 'locale', array( $this, 'filter_get_locale' ) );
Note: See TracChangeset for help on using the changeset viewer.