Das Arbeiten mit mehrsprachigem Inhalt kann aufwendig sein, insbesondere wenn unterschiedliche Domains für die Sprachen verwendet werden, da es erforderlich sein kann, dass man sich unter jeder Domain anmeldet.

Die Probleme

Dabei kann es zu mehreren Problemen kommen, die ein Anmelden für jede verwaltete Sprache sinnvoll machen, aber nicht immer erlauben:

  1. Ein serverseitiger Seiten-Cache speichert Inhalte für Gäste zwischen.
  2. Ein Caching-Plugin speichert Inhalte für Gäste zwischen.
  3. Es gibt unterschiedliche Inhalte für angemeldete Benutzer als für Gäste.
  4. Eine Anmeldung an jeder Domain ist aufgrund Einschränkungen nicht möglich (beispielsweise lässt ein Single Sign-on die Anmeldung nur auf einer Domain zu).

Da Polylang dir erlaubt, unterschiedliche (Sub-)Domains für jede Sprache zu verwenden, kannst du in eins oder mehrere dieser Probleme laufen. Das war auch für mich der Fall, nämlich eine Kombination eines serverseitigen Caches für Gäste und eine Einschränkung bezüglich der Anmeldung auf eine Domain.

Meine Lösung

Ich bemerkte, dass du eine übersetzte Seite von jeder Domain in Polylang aufrufen kannst, indem du einen URL-Paramter mit der Sprache einer Übersetzung hinzufügst. Auf diesem Weg kann ich sowohl die deutsche Version der Startseite über https://www.example.com/?lang=de als auch die französische Version über https://www.example.com/?lang=fr aufrufen.

Diese Methode verwende ich dann, um diesen URL-Parameter zu jeder Permalink-URL im Backend hinzufügen (da ich die Links im Frontend so belassen möchte, wie sie gedacht sind), sofern das System unterschiedliche Domains verwendet.

/**
 * Replace permalink with the current domain and add language parameter.
 * 
 * @param	string			$link Link to replace
 * @param	int|\WP_Post	$post Post ID or post object
 * @return	string Updated link
 */
public static function replace_permalink( string $link, int|\WP_Post $post ): string {
	if ( \is_int( $post ) ) {
		$post = \get_post( $post );
	}
	
	if ( ! $post instanceof \WP_Post ) {
		return $link;
	}
	
	$language = \pll_get_post_language( $post->ID, 'slug' );
	
	if ( empty( $language ) ) {
		return $link;
	}
	
	$current_domain = \wp_parse_url( \home_url(), \PHP_URL_HOST );
	$link_domain = \wp_parse_url( $link, \PHP_URL_HOST );
	
	if ( \is_string( $link_domain ) && \is_string( $current_domain ) && $link_domain !== $current_domain ) {
		$link = \str_replace( $link_domain, $current_domain, $link );
	}
	
	return \add_query_arg(
		[
			'lang' => $language,
		],
		$link
	);
}

$polylang_options = (array) \get_option( 'polylang' );

// 3 equals the setting for domains
if (
	\is_admin()
	&& isset( $polylang_options['force_lang'] )
	// 3 equals the setting for domains
	&& $polylang_options['force_lang'] === 3
) {
	\add_filter( 'attachment_link', 'replace_permalink', 10, 2 );
	\add_filter( 'page_link', 'replace_permalink', 10, 2 );
	\add_filter( 'post_link', 'replace_permalink', 10, 2 );
	\add_filter( 'post_type_link', 'replace_permalink', 10, 2 );
}
Code-Sprache: PHP (php)

Dabei gibt es jedoch einen Haken: Nur der eigentliche Beitragsinhalt wird in der Sprache angezeigt, die mit den URL-Parameter übergeben wird. Dinge wie Navigationsmenüs bleiben in der Sprache der Domain, die du verwendet hast, um die Seite aufzurufen. Im Beispiel oben heißt das beispielsweise bei primärer englischer Sprache, dass das Menü nach wie vor Englisch bleibt, auch wenn der Inhalt Deutsch oder Französisch ist.

Neuveröffentlichungen

Likes

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Um auf deiner eigenen Website zu antworten, gib die URL deiner Antwort ein, die einen Link zur Permalink-URL dieses Beitrags enthalten sollte. Deine Antwort wird dann (möglicherweise nach der Moderation) auf dieser Seite erscheinen. Möchtest du deine Antwort aktualisieren oder entfernen? Aktualisiere oder lösche deinen Beitrag und gib die URL deines Beitrags noch einmal ein. (Mehr über die Funktion von Webmentions erfahren)