web-dev-qa-db-fra.com

Ajouter le code de langue/pays à chaque URL possible

J'ai essayé de réaliser une personnalisation apparemment simple de la structure permalink sans succès. Le but est de toujours avoir /aa-bb/ devant chaque lien permanent, où aa est un code de langue et bb un code de pays. Tout ce qui vient après cela devrait se comporter exactement comme il le ferait normalement. Donc, là où normalement vous auriez /post-title/, après, vous auriez /en-gb/post-title/ et cela mènerait au même message (y compris toutes les variantes telles que pages, CPT, archives, catégories, recherche, etc.).

Le flux complet:

  1. Je génère une liste de valeurs de langue/pays valides = complète
  2. Je récupère la valeur de l'URL pour déterminer la langue/pays = complète
  3. Pendant le hook d’action template_redirect, je redirige vers la langue/le pays par défaut si aucune valeur valide n’est présente = complete
  4. Configurez une structure de réécriture permalien pour traiter ces URL comme si la première partie n'existait pas = mystery

Toutes les méthodes de réécriture WP permaliens semblent faire quelque chose de légèrement différent de cet objectif. Est-ce quelque chose qui serait mieux fait avec htaccess? WPML semble réussir avec ses codes de langue mais je ne sais pas comment.

L'utilisation de add_rewrite_rule est sûre, mais ne couvre qu'un type de lien permanent à la fois. J'ai donc peur de ne pas réussir si j'ajoutais manuellement toutes les variantes.

2
Berend

Je travaille actuellement sur une solution similaire: le site Web doit avoir des codes de langue dans toutes les URL (à l'exception de la langue par défaut), mais seules les pages sont traduisibles de la même manière que les plug-ins WPML/Polylang. Pour les actualités (blog), nous affichons uniquement les messages dans une langue particulière (ils sont séparés et non des traductions les uns des autres). Tous les autres contenus sont mélangés dans toutes les langues. En outre, l'interface utilisateur est également affichée dans une langue définie à partir de l'URL.

Voici ce que j'ai fait pour que ces règles de réécriture soient complétées par des codes de langue:

function prepend_default_rewrite_rules( $rules ) {

    // Prepare for new rules
    $new_rules = [];

    // Set up languages, except default one
    $language_slugs = ['ar', 'ku'];

    // Generate language slug regex
    $languages_slug = '(?:' . implode( '/|', $language_slugs ) . '/)?';


    // Set up the list of rules that don't need to be prefixed
    $whitelist = [
        '^wp-json/?$',
        '^wp-json/(.*)?',
        '^index.php/wp-json/?$',
        '^index.php/wp-json/(.*)?'
    ];

    // Set up the new rule for home page
    $new_rules['(?:' . implode( '/|', $language_slugs ) . ')/?$'] = 'index.php';

    // Loop through old rules and modify them
    foreach ( $rules as $key => $rule ) {

        // Re-add those whitelisted rules without modification
        if ( in_array( $key, $whitelist ) ) {

            $new_rules[ $key ] = $rule;

        // Update rules starting with ^ symbol
        } elseif ( substr( $key, 0, 1 ) === '^' ) { 

            $new_rules[ $languages_slug . substr( $key, 1 ) ] = $rule;


        // Update other rules
        } else {

            $new_rules[ $languages_slug . $key ] = $rule;

        }
    }


    // Return out new rules
    return $new_rules;
}
add_filter( 'rewrite_rules_array', 'prepend_default_rewrite_rules' );

Je n'ai pas encore testé la solution - je viens de trouver la solution après avoir étudié la classe WP_Rewrite. C'est donc un travail en cours. J'espère que ça aide quand même.

P.S .: En outre, je serais heureux de voir votre solution pour "Je récupère la valeur de l'URL pour déterminer la langue/le pays = complète" - c'est ce sur quoi je travaille actuellement :)

2
Ihor Vorotnov

Je crois que vous pourriez utiliser plugin polylang . J'ai réalisé l'un de mes projets, comme vous l'avez mentionné avec ce plugin.

0
por