2015-07-06 14 views
17

Ho sviluppato un plug-in di lingua per wordpress che funziona completamente. L'unica cosa che manca ora è la riscrittura dell'URL. Ho visto molti siti Web, fonti e altre domande su StackOverflow, ma non riesco a far funzionare i miei permalink.Wordpress: include la lingua variabile nell'URL

sono stato in grado di aggiungere una variabile stringa di query in questo modo:

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')); 

Questo cambia i miei collegamenti a http://www.mylink.com?lang=en_us per esempio. Quello che voglio ora, è quello di aggiungere un permastruct modo che l'utente possa avere abbastanza di URL (ad es http://www.mylink.com/en/)

ho aggiunto il seguente pezzo di codice:

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')); 

L'unica cosa che ho bisogno ora è una riscrittura La regola, presumo, ma potrei sbagliarmi completamente. Qualcuno che sa qual è la soluzione migliore per aggiungere questo permastrotto?

EDIT mi hanno cercato di ottenere questo lavoro per un mese e non mi sembra di essere in grado di ottenere una comprensione su permalink, nemmeno con tutte le risposte precedenti e la mia ricerca. Ecco perché sto sbattendo questo post con una taglia ancora una volta. Cosa mi serve: ho una funzione (get_locale) che restituisce un codice lingua. Questo codice lingua dovrebbe essere implementato nel mio url come segue: "http://www.mywebsite.com/LANGUAGE_HERE/..."

So che ho bisogno di registrare la mia struttura permalink per quello, ma è qui che tutto va storto. Di quali filtri ho bisogno e cosa devo inserire nelle funzioni del filtro? Qualsiasi aiuto è molto apprezzato, perché qui sto diventando piuttosto disperato.

EDIT 2

Così ho aggiunto regole di riscrittura, ma non sembrano funzionare. Sto diventando un po 'disperato qui. Comunque, questo è il codice per le regole di riscrittura:

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')); 

risposta

6

Una corretta impostazione Wordpress 2.0 + reindirizza tutte le richieste di /index.php in modo che non avrà bisogno di alcun aggiornamento htaccess, e il tuo aspetto perma-struct registrati bene. Credo che tutto ciò che rimane è configuring wordpress to use your %lang struct utilizzando una struttura personalizzata e si dovrebbe essere buona per andare

3

provare il seguente codice

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'); 
+0

Questo non è completo, ma riceverai suggerimenti su come procedere. – Yash

3

Ho avuto problemi con le strutture permalink troppo. A volte facendo clic sul permalink che si desidera e salvando di nuovo si risolve il problema. Come WordPress riscrive il htaccess durante il salvataggio.

+0

Quando accedi alla pagina dei permalinks dal back-end di amministrazione, esegue effettivamente un flush di permalink. –

1

Bene bene, ecco un blocco di codice che consente di ottenere quello che stai chiedendo.

public function init(){ 

    $permalink_structure = get_option('permalink_structure'); 

    if($permalink_structure != ''){ 

     global $wp_rewrite; 

     $lang = '/' . 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( 
       '#/+#', 
       '/', 
       '/' . 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); 

    }   
} 

Note:

1) Assicurarsi che si sta utilizzando il (si può dare la funzione di qualsiasi nome) Funzione init all'interno del gancio init.

2) Nella cartella wp-admin cercare options-permalink.php.A partire dalla riga 75 vedrai alcuni codici interessanti che costituiscono la base di questa risposta.

3) si potrebbe anche voler leggere questo article sul codice

Il codice di cui sopra non richiede all'utente di selezionare manualmente una struttura permalink. Qualsiasi struttura permalink utilizzata verrà anteposta allo locale.

+0

Ho intenzione di controllare questo stasera! ;) –

+0

Questo codice non sembra fare il trucco, perché ogni volta che cambio la lingua, il mio permalink aggiunge semplicemente la lingua corrente alla sua struttura (in questo modo:/nl_NL/pl_PL/en_US /% postname%) –

+0

Hmmm, Quello che puoi fare è controllare un elenco predefinito di locali e se tale locale esiste in '$ permalink_structure', quindi rimuoverlo e aggiungere la nuova locale. Quello sarebbe puro PHP. Una seconda opzione, dal momento che si ha a che fare con WordPress, sarebbe quella di memorizzare un'opzione nel database che terrebbe le impostazioni locali precedentemente impostate. Ogni volta che cambi la lingua, il tuo plug-in verificherà se le vecchie impostazioni locali esistono in '$ permalink_structure'. Se lo fa, rimuovilo. Se opti per la seconda opzione, il tuo codice dovrebbe essere posto prima di '$ permalink_structure = $ lang. $ permalink_structure' – MMK

Problemi correlati