2012-03-15 13 views
5

Attualmente sto lavorando su un sito wordpress che deve avere la possibilità di essere offerto in francese. Ho trovato un modo per far funzionare il tema con i file po e mo fr_FR quando aggiungo una variabile querystring l. vale a direCome rendere permalink di Wordpress ignorare riscrittura di URL personalizzata

site.tld sarà cedere il sito inglese di vaniglia, mentre site.tld/?l=fr attiverà il seguente codice nel mio functions.php per servire il dizionario francese:

<?php 
// http://codex.wordpress.org/Plugin_API/Filter_Reference/locale 
add_filter('locale', 'set_my_locale'); 
function set_my_locale($lang) { 
    if ("fr" == substr(strtolower(trim(strip_tags(stripslashes($_GET['l'])))), 0, 2)) { 
     // set language to french 
     return "fr_FR"; 
    } else { 
     // return original locale 
     return $lang; 
    } 
} 
?> 

questa messa a punto è già al lavoro. la mia domanda è: come faccio a riscrivere l'url così invece di site.tld/?l=fr posso semplicemente anteporre la struttura della cartella a fr, cioè site.tld/fr/?

così come se ci fosse una pagina site.tld/portoflio/autumn/ in inglese, site.tld/fr/portfolio/autumn/ sputerà quella francese. Ho avuto questa idea dal sito Web di Apple, dove la lingua è sempre anteposta alla struttura delle cartelle.

posso già fare questo accadere con un reindirizzamento esterno .htaccess:

RewriteBase/
RewriteCond ^[a-z]{2}/ 
RewriteRule ^([a-z]{2})/(.*)$ /$2?l=$1 [R,L] 

questo funziona, ma una volta che rimuovo la bandiera R serve franco-tradotto 404 not found isntead. sto indovinando quello che ho fatto è incasinare con le regole di riscrittura di wordpress perché ho bisogno di usare i permalink piuttosto. in questo momento sono impostato per utilizzare Month and name() nelle opzioni generali di amministrazione.

la mia domanda è, come faccio a fare wordpress ignorare la parte /fr/ e ancora servire la pagina corretta/post/etc?

è possibile? sono sulla strada giusta qui? ho bisogno del tuo aiuto, specialmente di fare ciò che è WISE e non solo ciò che è bello. ho provato questo http://pmg.co/a-mostly-complete-guide-to-the-wordpress-rewrite-api ma per la vita di me non riesco a farlo funzionare. :/


UPDATE: ok, quindi ecco qualche progresso prendendo spunto da @relu di seguito:

ho fatto che le mie regole sono state in scatola da .htaccess

Ho poi aggiunto le regole da @ relu ma nel modo seguente, perché Relu mi ha sempre inviato allo stesso indirizzo senza il /fr:

<? 
    // http://pmg.co/custom-wordpress-shortlinks 
    add_action('init', 'pmgtut_add_rewrites'); 
    function pmgtut_add_rewrites() { 
     add_rewrite_rule('^([a-z]{2})/?$', 'index.php?l=$matches[1]', 'top'); 
     add_rewrite_rule('^([a-z]{2})/(.*)$', 'index.php?l=$matches[1]&q=$matches[2]', 'top'); 
    } 
    add_filter('query_vars', 'pmgtut_query_vars', 10, 1); 
    function pmgtut_query_vars($vars) { 
     $vars[] = 'l'; 
     return $vars; 
    } 
?> 

ora le /fr soggiorni nella barra degli indirizzi, in modo che sia una buona cosa, ma due problemi persistono:

  1. wordpress mi sta servendo la pagina indice principale. sembra che non stia usando la parte &q=$matches[2] della regola; e

  2. il locale non viene impostato correttamente. Ho controllato se la variabile l è stata alimentata, quindi ho aggiunto echo 'l: $l'; dopo $l = get_query_var('l'); e ho notato due echi: uno l: e un altro l: fr subito dopo. il filtro viene eseguito due volte?sembra la prima volta che non vede il valore della queryvar, e poi sembra esserci una seconda volta che emette l: con fr già lì dentro .. alla fine della giornata le impostazioni locali non vengono cambiate .

aiuto aaaah.


AGGIORNAMENTO FINALE: nel mio ultimo respiro di frustrazione che ho cercato di nuovo, e ho trovato questo plugin qTranslate. fa quello che mi serve. grazie per tutto, specialmente per l'epico sforzo di @ relu e per rimanere in pow'r.

risposta

3

Aggiungi questo al vostro functions.php

add_filter('rewrite_rules_array','my_insert_rewrite_rules'); 
add_filter('query_vars','my_insert_query_vars'); 
add_action('wp_loaded','my_flush_rules'); 

// flush_rules() if our rules are not yet included 
function my_flush_rules(){ 
    $rules = get_option('rewrite_rules'); 

    if (! isset($rules['^([a-z]{2})/(.*)$'])) { 
     global $wp_rewrite; 
     $wp_rewrite->flush_rules(); 
    } 
} 

// Adding a new rule 
function my_insert_rewrite_rules($rules) 
{ 
    $newrules = array(); 
    $newrules['^([a-z]{2})/(.*)$'] = 'index.php?l=$matches[1]&q=$matches[2]'; 
    return $newrules + $rules; 
} 

// Adding the l var so that WP recognizes it 
function my_insert_query_vars($vars) 
{ 
    array_push($vars, 'l'); 
    return $vars; 
} 

non ho ancora testato questo, potrebbe essere necessario qualche ritocco, ma questo è il modo per farlo.

Ho praticamente adattato la versione trovata here.

registra anche il "l" var query in modo da poter ottenere il suo valore chiamando: get_query_var

add_filter('locale', 'set_my_locale'); 
function set_my_locale($lang) { 
    $l = get_query_var('l'); 

    if ("fr" == $l) { 
     // set language to french 
     return "fr_FR"; 
    } else { 
     // return original locale 
     return $lang; 
    } 
} 

UDATE: ignorare quanto sopra!


Rimuovere il filtro my_insert_query_vars() e sostituirlo con:

function register_rewrite_tag() { 
     add_rewrite_tag('%l%', '([a-z]{2})'); 
} 
add_action('init', 'register_rewrite_tag'); 

Qui ci sono anche le riscritture aggiornati per le pagine e post, ho guardato WordPress' $wp_rewrite->rules e adattati per soddisfare questo caso particolare :

function pmgtut_add_rewrites() { 
     add_rewrite_rule('^([a-z]{2})/?$', 'index.php?l=$matches[1]', 'top'); 
     add_rewrite_rule('^([a-z]{2})/(.?.+?)(/[0-9]+)?/?$', 'index.php?l=$matches[1]&pagename=$matches[2]&page=$matches[3]', 'top'); // Pages 
     add_rewrite_rule('^([a-z]{2})/([^/]+)(/[0-9]+)?/?$', 'index.php?l=$matches[1]&name=$matches[2]&page=$matches[3]', 'top'); // Posts 
} 
+0

wow scusa ho appena visto questo. Grazie!! ok, quindi quando aggiungo questi, mi riportano al link senza '/ fr' hmm .. qualche pensiero? am clueless atm –

+0

Hai rimosso quelle regole da .htaccess? Non sono necessari! – relu

+0

yeap, ha fatto così .. ho anche fatto in modo che solo le parole "rwrules" siano lì ... ti farò sapere appena possibile quando lo farò funzionare. nel frattempo sappi anche che se c'è una somma che non potremmo fare. grazie mille, 'preclearlo uomo! –

0

forse fuori tema ma questa è un'altra regola di riscrittura per le lingue del modulo; en_us/or jp/

add_rewrite_rule('^([a-z]{2}_[A-Z]{2}|^[a-z]{2})/?$', 'index.php?l=$matches[1]', 'top'); 
Problemi correlati