2015-07-06 21 views
17

Pracuję nad wtyczką językową dla wordpress, która działa całkowicie. Jedyne, czego teraz brakuje, to przepisywanie adresu URL. Patrzę na wiele stron internetowych, źródeł i innych pytań na temat stackoverflow, ale nie mogę sprawić, żeby moje permalinki działały.Wordpress: uwzględnij zmienną języka w url

I udało się dodać zmienną ciąg kwerendy tak:

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

To zmienia moje linki do http://www.mylink.com?lang=en_us na przykład. Co chcę teraz, jest dodanie permastruct tak, że użytkownik może mieć dość URL (np http://www.mylink.com/en/)

Dodałem następujący fragment kodu:

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

Jedyne co muszę teraz jest przepisanie rządzić, jak sądzę, ale mogę się całkowicie mylić. Ktoś, kto wie, jakie jest najlepsze rozwiązanie do dodania tego permastructa?

EDIT staram się uzyskać tej pracy na miesiąc teraz i nie wydają się być w stanie uzyskać zrozumienie na permalinks, nawet ze wszystkimi poprzednimi odpowiedziami i moich własnych badań. Dlatego właśnie ponownie napotykam ten post z nagrodą. Potrzebuję: Mam funkcję (get_locale), która zwraca kod języka. Ten kod językowy powinien być zaimplementowany w moim adresie URL w następujący sposób: "http://www.mywebsite.com/LANGUAGE_HERE/..."

Wiem, że muszę zarejestrować własną strukturę do tego linku, ale tutaj wszystko idzie źle. Jakich filtrów potrzebuję i co powinienem umieścić w moich funkcjach filtra? Każda pomoc jest bardzo doceniana, ponieważ tutaj jestem bardzo zdesperowana.

EDIT 2

Więc dodałem przepisywania zasady, ale nie wydaje się do pracy albo. Trochę tu jestem zrozpaczony. W każdym razie, jest to kod dla reguł przepisywania:

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

Odpowiedz

6

Prawidłowo Konfiguracja Wordpress 2.0+ przekieruje wszystkie żądania do /index.php więc nie trzeba będzie żadnych nowości .htaccess i zarejestrowany wygląd Perma-struct w porządku. Myślę, że wszystko, co pozostaje, to configuring wordpress to use your %lang struct stosując strukturę niestandardową i powinno być dobrze iść

3

Spróbuj następujący kod

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

To nie jest kompletne, ale otrzymasz podpowiedź, jak postępować. – Yash

3

miałem problemy ze strukturami niego zbyt. Czasami kliknięcie tego linku, który chcesz, i ponowne zapisanie rozwiązuje problem. W trakcie zapisywania WordPress przepisuje htaccess.

+0

Gdy uzyskujesz dostęp do strony permalinks z poziomu zaplecza administracyjnego, w rzeczywistości wykonuje ona proces permamentu bezpośredniego. –

1

No cóż, oto blok kodu, który zapewnia to, o co prosisz.

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

    }   
} 

Uwagi:

1) Upewnij się, że używasz (można nadać dowolną nazwę funkcja) funkcję init w haku init.

2) W folderze wp-admin poszukaj options-permalink.php.Począwszy od linii 75 zobaczysz kilka interesujących kodów, które stanowią podstawę tej odpowiedzi.

3) może również chcesz przeczytać tę article na Codex

Powyższy kod nie wymaga od użytkownika, aby ręcznie wybrać strukturę odnośnika. Każda zastosowana struktura permalink zostanie dodana z locale.

+0

Sprawdzę to dziś wieczorem! ;) –

+0

Ten kod wydaje się nie działać, ponieważ za każdym razem, gdy zmieniam język, mój permalink po prostu dodaje aktualny język do swojej struktury (jak:/nl_NL/pl_PL/en_US /% postname%) –

+0

Hmmm, Możesz tylko sprawdzić wcześniej zdefiniowaną listę ustawień narodowych i jeśli te ustawienia narodowe istnieją w '$ permalink_structure', a następnie usunąć je i dodać nowe ustawienia narodowe. To byłby czysty PHP. Drugą opcją, ponieważ masz do czynienia z WordPressem, byłoby zapisanie opcji w bazie danych, która utrzymywałaby wcześniej ustawione ustawienia narodowe. Za każdym razem, gdy zmieniasz język, wtyczka będzie sprawdzać, czy to stare locale istnieje w '$ permalink_structure'. Jeśli tak, usuń go. Jeśli zdecydujesz się na drugą opcję, twój kod powinien zostać umieszczony przed '$ permalink_structure = $ lang. $ permalink_structure' – MMK

Powiązane problemy