WordPress.org

Making WordPress.org

Changeset 5570


Ignore:
Timestamp:
06/15/2017 12:57:31 PM (5 years ago)
Author:
Otto42
Message:

Plugin Directory: Move hreflang from the theme into the plugin-directory plugin, change it to only show translated languages instead of all languages, in order to make google behave better. Props @joostdevalk, @otto42. Fixes #2870

Location:
sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/class-plugin-directory.php

    r5532 r5570  
    4444        add_filter( 'the_content', array( $this, 'filter_rel_nofollow' ) );
    4545        add_action( 'wp_head', array( Template::class, 'json_ld_schema' ), 1 );
     46        add_action( 'wp_head', array( Template::class, 'hreflang_link_attributes' ), 2 );
    4647
    4748        // Cron tasks.
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/class-template.php

    r5457 r5570  
    630630        ), home_url( 'wp-json/plugins/v1/plugin/' . $post->post_name . '/favorite' ) );
    631631    }
     632
     633    /**
     634     * Adds hreflang link attributes to WordPress.org pages.
     635     *
     636     * @link https://support.google.com/webmasters/answer/189077?hl=en Use hreflang for language and regional URLs.
     637     * @link https://sites.google.com/site/webmasterhelpforum/en/faq-internationalisation FAQ: Internationalisation.
     638     */
     639    public function hreflang_link_attributes() {
     640        global $wpdb;
     641
     642        wp_cache_add_global_groups( array( 'locale-associations' ) );
     643
     644        if ( false === ( $sites = wp_cache_get( 'local-sites', 'locale-associations' ) ) ) {
     645
     646            // get subdomain/locale associations
     647            $subdomains = $wpdb->get_results( 'SELECT locale, subdomain FROM locales', OBJECT_K );
     648
     649            $sites = Plugin_I18n::instance()->get_locales();
     650
     651            require_once GLOTPRESS_LOCALES_PATH;
     652
     653            foreach ( $sites as $key => $site ) {
     654                $gp_locale = \GP_Locales::by_field( 'wp_locale', $site->wp_locale );
     655                if ( empty( $gp_locale ) ) {
     656                    unset( $sites[ $key ] );
     657                    continue;
     658                }
     659
     660                $sites[ $key ]->subdomain = $subdomains[ $site->wp_locale ]->subdomain;
     661
     662                // Note that Google only supports ISO 639-1 codes.
     663                if ( isset( $gp_locale->lang_code_iso_639_1 ) && isset( $gp_locale->country_code ) ) {
     664                    $hreflang = $gp_locale->lang_code_iso_639_1 . '-' . $gp_locale->country_code;
     665                } elseif ( isset( $gp_locale->lang_code_iso_639_1 ) ) {
     666                    $hreflang = $gp_locale->lang_code_iso_639_1;
     667                } elseif ( isset( $gp_locale->lang_code_iso_639_2 ) ) {
     668                    $hreflang = $gp_locale->lang_code_iso_639_2;
     669                } elseif ( isset( $gp_locale->lang_code_iso_639_3 ) ) {
     670                    $hreflang = $gp_locale->lang_code_iso_639_3;
     671                }
     672
     673                if ( $hreflang ) {
     674                    $sites[ $key ]->hreflang = strtolower( $hreflang );
     675                } else {
     676                    unset( $sites[ $key ] );
     677                }
     678            }
     679
     680            // Add en_US to the list of sites.
     681            $sites['en_US'] = (object) array(
     682                'locale'    => 'en_US',
     683                'hreflang'  => 'en',
     684                'subdomain' => ''
     685            );
     686
     687            uasort( $sites, function( $a, $b ) {
     688                return strcasecmp( $a->hreflang, $b->hreflang );
     689            } );
     690
     691
     692            wp_cache_set( 'local-sites', $sites, 'locale-associations' );
     693        }
     694
     695        foreach ( $sites as $site ) {
     696            $url = sprintf(
     697                'https://%swordpress.org%s',
     698                $site->subdomain ? "{$site->subdomain}." : '',
     699                $_SERVER[ 'REQUEST_URI' ]
     700            );
     701
     702            printf(
     703                '<link rel="alternate" href="%s" hreflang="%s" />' . "\n",
     704                esc_url( $url ),
     705                esc_attr( $site->hreflang )
     706            );
     707        }
     708    }
    632709}
Note: See TracChangeset for help on using the changeset viewer.