WordPress: Sprachvariable in URL einfügen

Lesezeit: 4 Minuten

Benutzeravatar von Michiel Standaert
Michiel Standaert

Ich habe ein Sprach-Plugin für WordPress entwickelt, das vollständig funktioniert. Jetzt fehlt nur noch das URL-Rewriting. Ich habe mir viele Websites, Quellen und andere Fragen zu Stackoverflow angesehen, aber ich kann meine Permalinks nicht zum Laufen bringen.

Ich konnte eine Abfragezeichenfolgenvariable wie folgt hinzufügen:

public function append_query_string($url) 
{
    $args = array('lang' => $this->get_locale());
    return add_query_arg($args, $url);
}
add_filter('page_link', array($this, 'append_query_string'));
add_filter('post_link', array($this, 'append_query_string'));
add_filter('the_permalink', array($this, 'append_query_string'));

Dies ändert meine Links zu http://www.mylink.com?lang=en_us zum Beispiel. Was ich jetzt möchte, ist, ein Permastruct hinzuzufügen, damit Benutzer hübsche URLs haben können (z http://www.mylink.com/en/)

Ich habe das folgende Stück Code hinzugefügt:

public function add_query_var($vars)
{
    $vars['lang'] = $this->get_locale();
    return $vars;
}
add_filter('request' , array($this, 'add_query_var'), 10, 2 );

public function custom_permastruct() 
{
    add_permastruct('language', '%lang%', false);
}
add_action('wp_loaded', array($this, 'custom_permastruct'));

Das einzige, was ich jetzt brauche, ist eine Rewrite-Regel, nehme ich an, aber ich könnte mich total irren. Wer weiß, was die beste Lösung ist, um dieses Permastruct hinzuzufügen?

BEARBEITEN
Ich versuche seit einem Monat, dies zum Laufen zu bringen, und ich scheine nicht in der Lage zu sein, Permalinks zu verstehen, nicht einmal mit all den vorherigen Antworten und meinen eigenen Recherchen. Deshalb fülle ich diesen Beitrag noch einmal mit einem Kopfgeld aus. Was ich brauche: Ich habe eine Funktion (get_locale), die einen Sprachcode zurückgibt. Dieser Sprachcode sollte in meiner URL wie folgt implementiert werden: "http://www.mywebsite.com/LANGUAGE_HERE/..."

Ich weiß, dass ich dafür meine eigene Permalink-Struktur registrieren muss, aber da läuft alles schief. Welche Filter benötige ich und was sollte ich in meine Filterfunktionen einbauen? Jede Hilfe ist sehr willkommen, denn ich bin hier ziemlich verzweifelt.

BEARBEITEN 2

Also habe ich Rewrite-Regeln hinzugefügt, aber sie scheinen auch nicht zu funktionieren. Ich bin hier langsam etwas verzweifelt. Wie auch immer, dies ist der Code für die Rewrite-Regeln:

public function add_rewrite_rules()
{   
    $languages = $this->get_all_languages();
    foreach($languages as $language) {
        add_rewrite_rule('^' . $language->code . '/([^/]*)/?$', 'index.php?lang=$matches[1]', 'top');
    }
}
add_action('init', array($this, 'add_rewrite_rules'));

Ein richtig eingerichtetes WordPress 2.0+ leitet alle Anfragen an /index.php weiter, sodass keine htaccess-Updates erforderlich sind und Ihre registrierte Perma-Struktur gut aussieht. Ich denke, alles, was übrig bleibt, ist WordPress konfigurieren, um Ihre zu verwenden %lang Struktur Verwenden Sie eine benutzerdefinierte Struktur, und Sie sollten bereit sein

Versuchen Sie den folgenden Code

function custom_rewrite_rules(){
  global $langs; 
   //Array containing locale => pretty permalink key value pair
   /*
    $langs = array (
             'en_us' => 'en',
            )
   */

  foreach($langs as $locale => $lang) {
  add_rewrite_rule(
                   '^'.$lang.'/\/(.*)/?$',
                   'index.php?lang='.$locale,
                   'top'
                   );
  }

}
add_action( 'init', 'custom_rewrite_rules' );

  • Dies ist nicht vollständig, aber Sie erhalten Hinweise zum weiteren Vorgehen.

    – Jasch

    20. Juli 2015 um 13:23 Uhr

Ich hatte auch Probleme mit Permalink-Strukturen. Manchmal kann das Problem durch Klicken auf den gewünschten Permalink und erneutes Speichern gelöst werden. Da WordPress die htaccess beim Speichern.

  • Wenn Sie vom Admin-Backend aus auf die Seite mit den Permalinks zugreifen, wird tatsächlich ein Permalink-Flush durchgeführt.

    – Jim Maguire

    6. September 2015 um 18:56 Uhr

Benutzeravatar von MMK
MMK

Nun gut, hier ist ein Codeblock, der das erreicht, wonach Sie fragen.

public function init(){

    $permalink_structure = get_option( 'permalink_structure' );

    if( $permalink_structure != '' ){

        global $wp_rewrite;

        $lang = "https://stackoverflow.com/" . get_locale();

        if ( ! got_url_rewrite() )
            $prefix = '/index.php';

        if ( is_multisite() && !is_subdomain_install() && is_main_site() )
            $blog_prefix = '/blog';


        if ( ! empty( $permalink_structure ) ) {

            $permalink_structure = preg_replace( 
                '#/+#',
                "https://stackoverflow.com/",
                "https://stackoverflow.com/" . str_replace( '#', '', $permalink_structure )
            );

            if ( $prefix && $blog_prefix )
                $permalink_structure = $prefix . preg_replace( 
                    '#^/?index\.php#',
                    '',
                    $permalink_structure
                );
            else
                $permalink_structure = $blog_prefix . $permalink_structure;
        }


        if( substr( $permalink_structure, 0, strlen($lang) ) !== $lang ){
            $permalink_structure = $lang . $permalink_structure;
        }

        $wp_rewrite->set_permalink_structure( $permalink_structure );

    }          
}

Anmerkungen:

1) Stellen Sie sicher, dass Sie die verwenden init(Sie können der Funktion einen beliebigen Namen geben) Funktion innerhalb der init Haken.

2) Im wp-admin Ordner suchen options-permalink.php. Ab Linie 75 Sie werden einige interessante Codes sehen, die die Grundlage dieser Antwort bilden.

3) Vielleicht möchten Sie dies auch lesen Artikel auf dem Kodex

Der obige Code erfordert nicht, dass ein Benutzer manuell eine Permalink-Struktur auswählt. Jeder verwendeten Permalink-Struktur wird das vorangestellt locale.

1402910cookie-checkWordPress: Sprachvariable in URL einfügen

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

Privacy policy