CoderFunda
  • Home
  • About us
    • Contact Us
    • Disclaimer
    • Privacy Policy
    • About us
  • Home
  • Php
  • HTML
  • CSS
  • JavaScript
    • JavaScript
    • Jquery
    • JqueryUI
    • Stock
  • SQL
  • Vue.Js
  • Python
  • Wordpress
  • C++
    • C++
    • C
  • Laravel
    • Laravel
      • Overview
      • Namespaces
      • Middleware
      • Routing
      • Configuration
      • Application Structure
      • Installation
    • Overview
  • DBMS
    • DBMS
      • PL/SQL
      • SQLite
      • MongoDB
      • Cassandra
      • MySQL
      • Oracle
      • CouchDB
      • Neo4j
      • DB2
      • Quiz
    • Overview
  • Entertainment
    • TV Series Update
    • Movie Review
    • Movie Review
  • More
    • Vue. Js
    • Php Question
    • Php Interview Question
    • Laravel Interview Question
    • SQL Interview Question
    • IAS Interview Question
    • PCS Interview Question
    • Technology
    • Other

17 May, 2022

Adding hreflang tags automatically in WordPress subdirectory multisite

 Programing Coderfunda     May 17, 2022     Laravel, Laravel-Question, php     No comments   

 We have a WordPress MU subdirectory network setup:

  • www.example.com - main website, USA, global
  • www.example.com/uk/ - to display for UK visitors
  • www.example.com/au/ - to display for Australian visitors.

We want to add hreflang tags for each webpage, and exclude the locations custom post type.

From this question, I've adjusted the code in the child theme's functions.php to:

function add_hreflang_attribute() {
   $site_url = network_site_url(); // base URL
   $alt_langs = array( '', 'au', 'uk' ); // two-letter language code
   $page_path = substr(get_permalink(), strlen(home_url('/'))); // path of page after base URL
   
   if (!( is_singular( 'locations' ) ) ) {
           
       // loop through the alternative languages, and get the appropriate hreflang tag for each that exists
       foreach ($alt_langs as $lang) {
           $updated_url_lang_path = $site_url . $lang . '/' . $page_path;
           $url_headers = @get_headers($updated_url_lang_path);
           if($url_headers && strpos( $url_headers[0], '200')) {
               if ($lang == 'uk') {
                   echo '<link rel="alternate" href="' . $updated_url_lang_path . '" hreflang="en-gb" />'. PHP_EOL;
               } elseif ($lang == '') {
                 
               }
               else {
                   echo '<link rel="alternate" href="' . $updated_url_lang_path . '" hreflang="en-' . $lang . '" />'. PHP_EOL;
               }
           }
       }
       
       // set primary as x-default
       echo '<link rel="alternate" href="' . $site_url . $page_path . '" hreflang="x-default" />';
        
   }

}

This code works on the main website's home page & example page: www.example.com/features/;

<link rel="alternate" href="https://www.example.com/au/features/" hreflang="en-au" />
<link rel="alternate" href="https://www.example.com/uk/features/" hreflang="en-gb" />
<link rel="alternate" href="https://www.example.com/features/" hreflang="x-default" />

and it works for the:

  • AU site's home page,
  • the AU site's features page: https://www.example.com/au/features/,

but on www.example.com/uk/ it only produces:

<link rel="alternate" href="https://www.example.com/au/" hreflang="en-au" />
<link rel="alternate" href="https://www.example.com/" hreflang="x-default" />

It is missing:

<link rel="alternate" href="https://www.example.com/uk/" hreflang="en-gb" />

The features page is a simple WordPress page.

Help appreciated.

EDIT

If I add if ($lang == 'uk') {print_r(get_headers($updated_url_lang_path));}, I see:

Array
(
    [0] => HTTP/1.1 200 OK
    [1] => Server: nginx
    [2] => Date: Wed, 11 May 2022 22:08:04 GMT
    [3] => Content-Type: text/html; charset=UTF-8
    [4] => Content-Length: 88422
    [5] => Connection: close
    [6] => Vary: Accept-Encoding
    [7] => Vary: Accept-Encoding
    [8] => Accept-CH: Sec-CH-UA-Mobile
    [9] => Link: <https://www.example.com/uk/wp-json/>; rel="https://api.w.org/"
    [10] => Link: <https://www.example.com/uk/wp-json/wp/v2/pages/10>; rel="alternate"; type="application/json"
    [11] => Link: <https://www.example.com/uk/>; rel=shortlink
    [12] => X-Powered-By: WP Engine
    [13] => X-Cacheable: SHORT
    [14] => Vary: Accept-Encoding,Cookie
    [15] => Cache-Control: max-age=600, must-revalidate
    [16] => X-Cache: HIT: 8
    [17] => X-Cache-Group: normal
    [18] => Accept-Ranges: bytes
    [19] => X-Orig-Cache-Control: no-cache
)

and the following is added properly:

<link rel="alternate" href="https://www.example.com/uk/" hreflang="en-gb" />

However, I only see this while logged into WordPress.

In an incognito window, at https://www.example.com/uk/ I see (only):

<link rel="alternate" href="https://www.example.com/" hreflang="x-default" />
phpwordpress



2 Answers



I


 altered the code to:

function mm_add_hreflang_attribute() {
    if (!( is_singular( 'locations' ) ) ) {
        $sites = array(
            array('', 'x-default'),
            array('en-gb/', 'en-gb'),
            array('en-au/', 'en-au'),
        );
        
        if ( is_post_type_archive('locations') ) {
            foreach ( $sites as $site ) {
                $site_url = network_site_url();
                $page_path = 'locations/';
                $geo_url = $site[0];
                $hreflang = $site[1];
                $url = $site_url . $geo_url . $page_path;
                echo '<link rel="alternate" href="' . $url . '" hreflang="' . $hreflang . '" />'. PHP_EOL;
            }
        } else {
            foreach ( $sites as $site ) {
                $site_url = network_site_url();
                $page_path = substr(get_permalink(), strlen(home_url('/')));
                $geo_url = $site[0];
                $hreflang = $site[1];
                $url = $site_url . $geo_url . $page_path;
                echo '<link rel="alternate" href="' . $url . '" hreflang="' . $hreflang . '" />'. PHP_EOL;
            }
        }
    }
}
add_action('wp_head', 'mm_add_hreflang_attribute', 1);












  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg
Email ThisBlogThis!Share to XShare to Facebook
Newer Post Older Post Home

0 comments:

Post a Comment

Thanks

Meta

Popular Posts

  • Vue.js Events
      In Vue.js, Events are used to respond to an action. Suppose, you have to build a dynamic website using Vue.js then you'll most likely ...
  • Is there a way to use awk to count the number of rows between 2 flags and input that number into a specific field?
    I have a set of data that consists of seismic wave travel times and their corresponding information (i.e. source that produced the wave and ...
  • Use Leaflet.js and Google Maps Blade Components in Laravel
      Laravel Maps   is a package to easily create maps using   Leaflet.js   or Google Maps and Blade components. The main features that work wi...
  • Luhn Algorithm Package for Laravel
    Laravel Luhn is a package by   Vincent Prat   that provides utilities to ease validation and computation of credit cards,   SIREN codes , an...
  • Use Emmet-style Abbreviations in Blade Components
      Laravel   Blade Emerald   provides   Emmet -like abbreviations to generate and wrap Laravel Blade components with markup. It works by usin...

Categories

  • Ajax (26)
  • Bootstrap (30)
  • DBMS (42)
  • HTML (12)
  • HTML5 (45)
  • JavaScript (10)
  • Jquery (34)
  • Jquery UI (2)
  • JqueryUI (32)
  • Laravel (1017)
  • Laravel Tutorials (23)
  • Laravel-Question (6)
  • Magento (9)
  • Magento 2 (95)
  • MariaDB (1)
  • MySql Tutorial (2)
  • PHP-Interview-Questions (3)
  • Php Question (13)
  • Python (36)
  • RDBMS (13)
  • SQL Tutorial (79)
  • Vue.js Tutorial (69)
  • Wordpress (150)
  • Wordpress Theme (3)
  • codeigniter (108)
  • oops (4)
  • php (853)

Social Media Links

  • Follow on Twitter
  • Like on Facebook
  • Subscribe on Youtube
  • Follow on Instagram

Pages

  • Home
  • Contact Us
  • Privacy Policy
  • About us

Blog Archive

  • July (4)
  • September (100)
  • August (50)
  • July (56)
  • June (46)
  • May (59)
  • April (50)
  • March (60)
  • February (42)
  • January (53)
  • December (58)
  • November (61)
  • October (39)
  • September (36)
  • August (36)
  • July (34)
  • June (34)
  • May (36)
  • April (29)
  • March (82)
  • February (1)
  • January (8)
  • December (14)
  • November (41)
  • October (13)
  • September (5)
  • August (48)
  • July (9)
  • June (6)
  • May (119)
  • April (259)
  • March (122)
  • February (368)
  • January (33)
  • October (2)
  • July (11)
  • June (29)
  • May (25)
  • April (168)
  • March (93)
  • February (60)
  • January (28)
  • December (195)
  • November (24)
  • October (40)
  • September (55)
  • August (6)
  • July (48)
  • May (2)
  • January (2)
  • July (6)
  • June (6)
  • February (17)
  • January (69)
  • December (122)
  • November (56)
  • October (92)
  • September (76)
  • August (6)

Loading...

Laravel News

Loading...

Copyright © CoderFunda | Powered by Blogger
Design by Coderfunda | Blogger Theme by Coderfunda | Distributed By Coderfunda