Language Code im HTML-Tag von WordPress ohne Region-Code

Aus verschiedenen Gründen kann es sinnvoll sein, die Sprachdeklaration einer Website auf den „Primary Language Subtag“ zu beschränken. Also den Sprachcode ohne die Region-Angabe. Da WordPress per Default über den Filter language_attributes() den vollständigen Sprachode ausgibt, muss man hierzu den Filter ändern.

Zudem haben wir nichts zu verschenken:

It is recommended to keep the usage of attributes and their values defined on the html element to a minimum to allow for proper detection of the character encoding declaration within the first 1024 bytes.

In WordPress-Themes wird der <html>-Tag üblicherweise in der Template-Datei header.php wie folgt aufgebaut:

<html <?php language_attributes(); ?>>

Dies erzeugt dann folgende Ausgabe, wenn man seine Website auf die Sprache Englisch (United States) gestellt hat:

<html language="en-US">

bzw. bei Einstellung von „Deutsch“ auch

<html language="de-DE">

Um  language_attributes() zu ändern, erstellen wir eine eigene Funktion und weisen diese dann dem Filter zu:

/* 
 * Returns language code, without subcode
 */
function my_get_language_main () {
    $charset = split('-',get_bloginfo('language'))[0];
    return $charset;
}

/* 
 * Change WordPress default language attributes function to 
 * strip of region code parts
 */
function my_get_language_attributes ($doctype = 'html' ) {
    $attributes = array();
	
    if ( function_exists( 'is_rtl' ) && is_rtl() )
	    $attributes[] = 'dir="rtl"';
    
    if ( $langcode = my_get_language_main() ) {
	    if ( get_option('html_type') == 'text/html' || $doctype == 'html' )
		    $attributes[] = "lang=\"$langcode\"";

	    if ( get_option('html_type') != 'text/html' || $doctype == 'xhtml' )
		    $attributes[] = "xml:lang=\"$langcode\"";
    }	
    $output = implode(' ', $attributes);
    return $output;
}

function my_language_attributes( $doctype = 'html' ) {
    echo my_get_language_attributes( $doctype );
}
add_filter( 'language_attributes', 'my_language_attributes', 10, 2);

Erklärung: In der Funktion my_get_language_main() gebe ich einfach nur den Languagecode ohne die Regioncodes zurück. Diese Funktion rufe ich dann in der Funktion my_get_language_attributes()  auf um den Sprachcode einzusetzen. Ich deklariere danach die Funktion noch als Filter und ändere am Ende den vorhandenen Filter von   ‚language_attributes‚ auf meinen eigenen neuen Filter.

 

Warum mach ich das so aufwendig und nicht einfach in der Template-Datei header.php eine Zeile wie diese:

<html lang="<?php echo split('-',get_bloginfo('language'))[0]; ?>">

Die Antwort ist: Zum einen gibt es verschiedene Plugins, die mit eigenen Templates daherkommen können. Diese werden meine Definition in der header.php nicht kennen oder nicht berücksichtigen, sondern eben wie bisher den Filter language_attributes() aufrufen. Zum anderen bietet mir meine eigene Funktion auch die Möglichkeit noch andere Theme-bezogene Attribute an der Stelle einzubauen.

Einfacher und schneller ist die eine Zeile allemal. Aber wenn ich mehr vorhab und sicher gehen will, dass mir keine Plugins Probleme machen, mach ich es lieber richtig.