Fügen Sie im WordPress i18n-Projekt Präfixe hinzu, indem Sie interne Links mit Variablen auslösen

Lesezeit: 5 Minuten

Benutzer-Avatar
BOZ

Wir arbeiten an einem Lokalisierungsprojekt in WordPress. Tatsächlich können wir die aktive Browser-URL mit Sprachunterstützung korrekt hinzufügen. Ich werde die Details und den gesamten Code unten hinzufügen. Keine Sorge, meine Frage wird nicht so offen sein und ich werde sie konkretisieren.

Schritt 1

Zunächst sollten wir dem WordPress-Algorithmus eine Variable in der Linkstruktur hinzufügen.

function custom_rewrite_basic_query_vars( $query_vars ){
    $query_vars[] = 'lang';
    return $query_vars;
}
add_filter( 'query_vars', 'custom_rewrite_basic_query_vars' );

So erkennt WordPress eine Variable wie z ?lang= und schließt es in den Abfragemechanismus ein.

Schritt 2

Mit der Funktion “add_rewrite_rule” müssen Sie die Variable hinzufügen ?lang= im Hintergrund der persistenten Linkstruktur von WordPress ausgeführt werden.

Einfaches Beispiel:

/*
LANG PREFIX + INDEX = localhost/en/ = localhost/?lang=en
*/

add_rewrite_rule(
    '^(en|fr|de|ru|tr)/?$',
    'index.php?lang=$matches[1]',
    'top'
);

Ich werde die verbleibenden Instanzen nicht einzeln hinzufügen, da Sie fast 20 Umschreibungsregeln verwenden sollten. (Datum, Kategorie, Kommentar, Seite, Text, Paginierung usw.)

HINWEIS: Diejenigen, die an einem solchen Projekt arbeiten und diese Regeln verwenden möchten, werden es auf Anfrage hinzufügen.


Jetzt unterstützt unsere persistente Verbindungsstruktur Variablen für die Sprachoption.

localhost/en/hello-world

localhost/ru/hello-world

localhost/de/04/07/2019

localhost/fr/page/2

usw. alle Verbindungen, die Sie sich vorstellen können.

Schritt 3

Wenn eine Variable vom Browser erkannt wird (z. B.: lang = en), zeigen wir den Inhalt der zuvor gespeicherten intersprachlichen Übersetzung an.

An dieser Stelle benötigen wir keine Unterstützung. Aber wenn wir zu Schritt 4 kommen, stecken wir fest.

Schritt 4

Durch Aktivieren der zuvor hinzugefügten Präfix-Sprachvariablen können Benutzer bei Verwendung der Links innerhalb der Website auf alle Navigationslinks innerhalb der Website zugreifen.

Das bedeutet, wenn ein Benutzer Zugriff auf die localhost/fr/hello-world Link, sie müssen den erreichen localhost/fr/contact Link, wenn sie zur Homepage zurückkehren oder auf den Link Kontakt klicken.

Dazu müssen Sie allen Insite-Links das aktuell im Browser aktive Sprachpräfix hinzufügen.

Leider ist dies der einzige Punkt, an dem wir uns aufhalten und wir keine Lösung finden können.

Tatsächlich haben wir die meisten Dinge ausprobiert, bevor wir hier geschrieben haben. (Natürlich nach unserem Wissen). Wir haben uns sogar Plug-Ins angesehen, die eine gewisse Sprachunterstützung bieten.

z.B <WP Multilang>

Natürlich ist es so kompliziert und so viel Code. Wir haben nicht einmal das Plug-in verstanden.

Es gibt natürlich einen logischen Weg, dies zu tun, und ich hoffe, dass diese Person diesen Beitrag sieht und antwortet. Herzlichen Dank für all Ihre Unterstützung.


Ein Schritt zur Antwort

Nach einer Weile erreichte ich den folgenden Code und bestätigte, dass er korrekt funktionierte.

<?php

function link_fn( $url ){

    $lang = get_query_var('lang', false);       

    if( $lang !== false && strpos( $url, $lang ) !== false )
        $url = $url . $lang . "https://stackoverflow.com/";

    return $url;
}

add_filter( 'shortcut_link', 'link_fn' );
add_filter( 'post_link', 'link_fn' );
add_filter( 'page_link', 'link_fn' );
add_filter( 'post_type_link', 'link_fn' );
add_filter( 'attachment_link', 'link_fn' );
add_filter( 'term_link', 'link_fn' );
add_filter( 'author_link', 'link_fn' );
add_filter( 'post_type_archive_link', 'link_fn' );
add_filter( 'day_link', 'link_fn' );
add_filter( 'month_link', 'link_fn' );
add_filter( 'year_link', 'link_fn' );

Aber an dieser Stelle stieß ich auf ein Problem. Hier bekommen wir Daten wie “localhost/hello-world/[LANG]/“.

Was ich will ist “localhost/[LANG]/hello-world“.

Um dieses Problem zu lösen, müssen Sie der vorhandenen URL-Struktur eine REGEX-Abfrage hinzufügen. Wenn sie die LANG nicht enthält, fügen Sie den Sprachcode zur BASIS-URL hinzu. Da eine REGEX-Abfrage hinzugefügt werden sollte, konnte ich dies nicht tun …

Ich möchte meine eigene Frage nicht beantworten und bestätigen. Zusätzlich zu dem Code, den ich oben geschrieben habe, werde ich, wenn es eine Antwort gibt, die die von mir gewünschte Abfrage enthält, diese als Antwort markieren.


Antworten

function link_fn( $url ){

    $lang = get_query_var('lang', false);

    $site_url = get_option('home');

    if( $lang !== false )
    {
        $new_url = str_replace( $site_url, "", $url );

        if( preg_match('/\b$lang\b/', $new_url) !== false )
        {
            $url = $site_url."https://stackoverflow.com/".$lang.$new_url;
        }

    }

    return $url;
}

add_filter( 'home_url', 'link_fn' );

  • Wie gelangt ein Benutzer zu den verschiedenen Sprachen? Sie könnten einfach ein Cookie in ihrem Browser mit ihrer Sprachauswahl speichern und dann das Cookie lesen, um sicherzustellen, dass der URL die Sprachabkürzung angehängt wird. Auch WPML (wpml.org) ist wahrscheinlich eines der am einfachsten zu verwendenden mehrsprachigen Plugins – und bietet gleichzeitig wirklich nette erweiterte Funktionen.

    – Desinformation

    12. September 2019 um 18:03 Uhr

  • Möchten Sie basierend auf der Browsersprache des Benutzers umleiten? WPML nutzt es gut.

    – Ohrid

    14. September 2019 um 3:48 Uhr

Du bist wirklich weit gekommen. Sehr schöner Aufwand

Ich verstehe, dass zwischen Ihnen und dem Sieg nur die Änderung der Ergebnis-Link-Struktur steht?

Wenn ja, hier ist eine Lösung:

function link_fn($url){

    $lang = get_query_var('lang', false);
    $url_parts = explode("https://stackoverflow.com/", $url);

    if ( $lang && in_array($lang, $url_parts) === false) { // lang does not exists in URL
        array_splice($url_parts, 1, 0, $lang);
    }
    $url = implode("https://stackoverflow.com/", $url_parts);
    return $url;

}

  • Auch wenn dies nicht die genaue Antwort ist, akzeptiere ich es, um mich zu ermutigen, die Antwort zu finden. Ich werde bald die richtige Antwort am Ende der Frage hinzufügen. Vielen Dank.

    – BÖZ

    21. September 2019 um 15:53 ​​Uhr

Ich denke, ein möglicher Ansatz besteht darin, alle HTML-Inhalte zu verwenden ob_start() und ob_get_contents() und dann den ganzen Link mit regEx bekommen.

Hinweis: Nicht alle Links sind Beiträge/Seiten, es gibt auch einige statische Dateien.

Benutzer-Avatar
illia permiakov

Kann Ihre Sprachkonstante ein Teil der Abfragezeichenfolge anstelle des Pfads sein?

Anstatt von

localhost/en/hello-world

so was

localhost/hello-world?lang=en

Wenn ja, schau dir an, wie man zusätzliche Variablen in URLs mit WordPress übergibt

  • Vielen Dank. Leider werden alle zur URL der aktiven Seite im Browser hinzugefügt. Diese Phase haben wir bereits hinter uns.

    – BÖZ

    15. September 2019 um 8:34 Uhr

Ich schlage vor, in diese Richtung zu graben.

add_action( 'pre_get_posts', 'lang_pre_get_posts', 1 );
function lang_pre_get_posts( $query ) {
    if ( is_admin() || ! $query->is_main_query() ){
        return;
    }
    add_query_arg( 'lang', filter_var( $_COOKIE["lang"], FILTER_SANITIZE_STRING ) );
}

1368270cookie-checkFügen Sie im WordPress i18n-Projekt Präfixe hinzu, indem Sie interne Links mit Variablen auslösen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy