Polylang: Sprachen über URL-Parameter aufrufen
Veröffentlicht: – Kommentar hinterlassen
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:
- Ein serverseitiger Seiten-Cache speichert Inhalte für Gäste zwischen.
- Ein Caching-Plugin speichert Inhalte für Gäste zwischen.
- Es gibt unterschiedliche Inhalte für angemeldete Benutzer als für Gäste.
- 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