Ich habe es geschafft, eine Funktion zu schreiben, die die Arbeit erledigt, aber ich habe das Gefühl, dass es einen besseren Weg geben muss, dies zu tun.
Ich habe ein WordPress Multisite-Netzwerk, das mit dem Unterverzeichnis setup läuft. Es gibt eine primäre Website auf Englisch und mehrere untergeordnete Websites, die größtenteils in andere Sprachen übersetzt wurden. Die Übersetzung ist im Gange und es gibt noch keine entsprechende Seite/Post für jede Seite im Netzwerk. Für einen Beitrag, der auf der englischen Seite existiert, aber noch nicht auf der spanischen Seite, ein hreflang-Tag für website.com/some-blog-post
wird ein 404 für zurückgeben website.com/es/some-blog-post
.
Ich habe diese Funktion in die Themen platziert functions.php
Datei vorerst. Das Site-Thema ist mit Timber/Twig erstellt und es gibt kein header.php
Datei, so dass das Hinzufügen zu einer Vorlage oder einem Teil davon eine strukturelle Umgestaltung erfordern würde. Ich verwende den 2-Buchstaben-Code als Textzeichenfolge zum einfachen Einfügen in beide hreflang
und entsprechendes Unterverzeichnis in der URL.
Dies scheint angesichts der Einschränkungen die praktikabelste Lösung zu sein, obwohl PHP nicht meine Stärke ist. Wenn es einen besseren Weg gibt, bin ich dafür.
/**
* ADD HREFLANG ATTRIBUTES
* Automatically append hreflang with network URL, language, and permalink to all pages
*/
function add_hreflang_attribute() {
$site_url = "network_site_url()"; // base URL
$alt_langs = array( 'de', 'es', 'fr' ); // two-letter language code
$page_path = substr(get_permalink(), strlen(home_url("https://stackoverflow.com/"))); // path of page after base URL
// get primary English site URL and page path
echo '<link rel="alternate" href="'%20.%20$site_url%20.%20$page_path%20.%20'" hreflang="en" />'. PHP_EOL;
// 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 . "https://stackoverflow.com/" . $page_path;
$url_headers = @get_headers($updated_url_lang_path);
if($url_headers && strpos( $url_headers[0], '200')) {
echo '<link rel="alternate" href="'%20.%20$updated_url_lang_path%20.%20'" hreflang="' . $lang . '" />'. PHP_EOL;
}
}
// set primary as x-default
echo '<link rel="alternate" href="'%20.%20$site_url%20.%20$page_path%20.%20'" hreflang="x-default" />';
}
add_action('wp_head', 'add_hreflang_attribute', 1);
Auch hier funktioniert es, aber ich würde es gerne besser machen, wenn ich kann. Vorab vielen Dank für alle Hinweise und ein frohes neues Jahr!
Am Ende habe ich eingestellt
$alt_langs = array( '', 'au', 'uk' );
um die hinzuzufügenuk
&au
wechselt auf der Hauptseite, wie ohne die''
das'au
&uk
Alternativen wurden auf der Hauptseite nicht angezeigt.– Steve
6. Mai um 7:15 Uhr
Ich habe Anpassungen vorgenommendie Hauptseite
https://mandoestage.wpengine.com/features/
funktioniert gut, aber die AU-Site funktioniert überhaupt nichthttps://mandoestage.wpengine.com/au/features/
(mit dem gleichen Thema). Irgendwelche Vorschläge?– Steve
6. Mai um 8:52 Uhr
Schwer zu sagen, ohne den größeren Kontext Ihrer Website zu kennen, aber meine erste Vermutung wäre, dass Sie keine leeren Elemente auf Ihrer Website haben
$alt_langs
Reihe. Die Homepage ist die Standardeinstellung und relevanthreflang
denn das gehört nicht dazuforeach
Schleife.– Mike Jandreau
11. Mai um 20:15 Uhr
Ich habe entfernt
''
aus$alt_langs
. Der Code funktioniert, wenn ich angemeldet bin, aber nicht in einem Inkognito-Fenster, in dem ich abgemeldet bin. Im Inkognito-Fenster sehe ich nur<link rel="alternate" href="https://www.example.com/" hreflang="x-default" />
nicht der/au/, en-au
oder/uk/, en-gb
Stellvertreter.– Steve
11. Mai um 23:18 Uhr
Sehen diese Antwort für eine Alternativlösung.
– Steve
13. Mai um 4:30 Uhr