2012-03-15 10 views
5

Actualmente estoy trabajando en un sitio de wordpress que debe tener la opción de ofrecerse en francés. He encontrado una manera de hacer que el tema funcione con los archivos po y mo de fr_FR cuando agrego una variable querystring l. es decir,Cómo hacer que los enlaces permanentes de Wordpress ignoren la reescritura de url personalizada

site.tld cederá el sitio Inglés de vainilla, mientras que site.tld/?l=fr activará el código siguiente en mi functions.php para servir la traducción en francés:

<?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; 
    } 
} 
?> 

esta configuración ya está trabajando. mi pregunta es: ¿cómo reescribo el URL así que en lugar de site.tld/?l=fr puedo anteponer la estructura de la carpeta con fr, es decir, site.tld/fr/?

así que si hay una página site.tld/portoflio/autumn/ en inglés, site.tld/fr/portfolio/autumn/ escupirá el francés. Obtuve esta idea en el sitio web de Apple, donde el lenguaje siempre está antepuesto a la estructura de la carpeta.

Ya puedo hacer que esto ocurra con una redirección externa en .htaccess:

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

esto funciona, pero una vez que se quita la bandera R sirve al 404 isntead que no se encuentra traducida-francés. Supongo que lo que hice fue arruinar las reglas de reescritura de WordPress porque necesito usar enlaces permanentes bonitos. ahora estoy configurado para usar Month and name (/%year%/%monthnum%/%postname%/) en las opciones generales del administrador.

mi pregunta es, ¿cómo hago que WordPress ignore la parte /fr/ y siga publicando la página/publicación correcta/etc.?

¿esto es posible? estoy en el camino correcto aquí? Necesito tu ayuda especialmente haciendo lo que es WISE y no solo lo que es NICE. Intenté esto http://pmg.co/a-mostly-complete-guide-to-the-wordpress-rewrite-api pero por mi vida no puedo hacerlo funcionar. :/


ACTUALIZACIÓN: ok, así que aquí tiene algunos avances tomando el ejemplo de @relu a continuación:

Me aseguré mis reglas eran lata de .htaccess

i luego agregó las reglas de @ relu, pero de la siguiente manera, porque Relu siempre me envió a la misma dirección sin el /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; 
    } 
?> 

ahora los /fr estancias en la barra de direcciones, por lo que es una buena cosa, pero persisten dos problemas:

  1. wordpress me está sirviendo a la página principal del índice. parece que no está usando la parte &q=$matches[2] de la regla; y

  2. la configuración regional aún no se establece correctamente. Verifiqué si la variable l se está alimentando, así que agregué echo 'l: $l'; después de $l = get_query_var('l'); y curiosamente recibí dos ecos: uno l: y otro l: fr justo después de eso. ¿Se está ejecutando el filtro locale dos veces?parece ser la primera vez que no ve el valor de la consultavar, y luego parece haber una segunda vez que muestra l: con fr ya está allí ... al final del día, la configuración regional aún no se cambia .

aaaah ayuda.


INFORME FINAL DE ACTUALIZACIÓN: en el último suspiro de frustración Busqué de nuevo, y encontraron esta qtranslate plugin. hace lo que necesito gracias a todos, especialmente al esfuerzo épico de @relu y a la permanencia en el poder.

Respuesta

3

Agregar a su 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; 
} 

no he probado esto, puede ser necesario ajustar algunos parámetros, pero esta es la manera de hacerlo.

Básicamente, he adaptado la versión encontrada here.

También registra el "l" var query para que pueda obtener su valor llamando: 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: haga caso de lo anterior!


Retire el filtro my_insert_query_vars() y sustituirla por:

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

Aquí están también las reescrituras actualizados de páginas y mensajes, He mirado en WordPress' $wp_rewrite->rules y ellas adaptada para encajar este caso especial :

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 lo siento, acabo de ver esto. ¡¡Gracias!! ok, entonces cuando agrego estos, me llevan de vuelta al enlace sin el '/ fr' hmm .. alguna idea? estoy despistado atm –

+0

¿Eliminaste esas reglas de .htaccess? ¡No son necesarios! – relu

+0

yeap, lo hice ... también me aseguré de que solo las reglas de wordpress estén ahí ... te avisaré lo antes posible cuando lo haga funcionar. mientras tanto, déjame saber si hay algo más que podamos hacer. muchas gracias, '¡preciate hombre! –

0

tal vez fuera del tema pero aquí hay otra regla de reescritura para los idiomas del formulario; es_us/o jp/

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