web-dev-qa-db-fra.com

Comment utiliser la règle de réécriture ou le point de terminaison de réécriture pour changer de langue?

Le but est que cela fonctionne:

www.pageurl.de -> rien ne se passe

www.pageurl.de/en/ -> une variable est définie et stockée dans un cookie

cela nécessite également de travailler avec des permaliens, des catégories, etc. comme ceci:

www.pageurl.de/en/linktopost/

www.pageurl.de/en/categoryname/

j'ai essayé de travailler avec
add_rewrite_endpoint('en',EP_PERMALINK|EP_PAGES|EP_ROOT|EP_CATEGORIES);

mais le point final (qui a du sens) ne fonctionne qu'à la fin de l'URL

j'ai aussi essayé de travailler avec

$language="en"; add_rewrite_rule('^' . $language . '/([^/]*)/?$', 'index.php?lang=$matches[1]', 'top'); mais www.pageurl.de/en/ ne renvoie qu'un 404

Quelle est la meilleure façon de procéder?

J'ai besoin d'avoir le modèle de langue dans l'URL sur la page entière, disons qu'après avoir changé la page dans un menu, le "en" doit être dans l'URL.

1
buckdanny

Vous ne pouvez pas faire cela en ajoutant simplement une règle de réécriture, vous devez modifier toutes les règles enregistrées.

Voici un moyen simple de faire cela:

function my_rewrite_rules($rules) {

    $new_rules = array();

    $new_rules['(?:de|en)/?$'] = 'index.php';

    foreach ($rules as $key => $val) {

        $key = '(?:de|en)/?' . $key;

        $new_rules[$key] = $val;

    }

    return $new_rules;
}

add_filter('rewrite_rules_array', 'my_rewrite_rules', 11);

Vous avez maintenant besoin d'un moyen de recevoir la valeur de la langue afin de la sauvegarder dans un cookie.

Vous pouvez ajouter un paramètre pour la langue, afin de l'inclure dans le $_GET super global. Mais cela signifierait de compenser tous les autres paramètres de toutes les autres règles, et cela impliquerait beaucoup de regex.

Au lieu de cela, vous pouvez simplement obtenir le langage en interrogeant le $_SERVER global:

preg_match('/\/(de|en)(\/|$|\?|#)/', $_SERVER['REQUEST_URI'], $matches);
1
maxime schoeni