2015-07-06 18 views
17

'deki dil değişkenini içeriyor Tamamen çalışan wordpress için bir dil eklentisi geliştiriyorum. Şu anda eksik olan tek şey, url-yeniden yazma. Birçok web sitesine, kaynağa ve yığın sorgulama ile ilgili diğer sorulara bakıyordum, ancak izinlerimin işe yaraması mümkün görünmüyor.Wordpress: url

ben şöyle bir sorgu dize değişkeni eklemek mümkün olmuştur:

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

Bu, örneğin http://www.mylink.com?lang=en_us benim bağlantıları değiştirir. Ne, şimdi istediğiniz kullanıcı olabilir böylece bir permastruct eklemektir oldukça url (örn http://www.mylink.com/en/) Ben aşağıdaki kod parçasını eklemiş

:

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

Şu an ihtiyacım olan tek şey bir yeniden yazma olduğunu kuralı, sanırım, ama tamamen yanlış olabilirim. Bu permastruct eklemek için en iyi çözümün ne olduğunu bilen var mı?

DÜZENLEME Şimdi bir ay boyunca bu çalışma almak için uğraşıyorlar ve ben bile önceki tüm cevaplar ve kendi araştırma ile, kalıcı bir kavrayışa elde edebilmek için görünmüyor. İşte bu yüzden bu yazıyı yine bir ödülle çarpıyorum. İhtiyacım olan şey: Bir dil kodu döndüren bir işlevim (get_locale) var. Bu dil kodu, URL'mde şu şekilde uygulanmalıdır: "http://www.mywebsite.com/LANGUAGE_HERE/..."

Bunun için kendi permalink yapısını kaydetmem gerektiğini biliyorum, ancak her şeyin yanlış gittiği yer burası. Hangi filtrelere ihtiyacım var ve filtre işlevlerime ne yazmalıyım? Herhangi bir yardım büyük beğeni topluyor, çünkü burada oldukça çaresizleşiyorum. 2

DÜZENLEME Bu yüzden kuralları yeniden eklendi, ama onlar da çalışmak için görünmüyor. Burada biraz çaresizim. Neyse, bu yeniden yazma kuralları için kodudur:

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

cevap

6

Doğru kurulum Wordpress 2.0+ herhangi htaccess güncellemelerini gerekir ve kayıtlı perma-yapı görünüyor olmayacak şekilde /index.php için tüm istekleri yönlendirir ince. Ben kaldığını hepsi özel yapısı kullanılarak configuring wordpress to use your %lang struct olduğunu düşünüyorum ve

3

Ben de permalink yapıları ile ilgili sorunlar yaşadım aşağıdaki kodu

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

Bu işlem tamamlanmadı, ancak nasıl devam edeceğinize dair ipucu alacaksınız. – Yash

3

deneyin gitmek için iyi olmalıdır. Bazen istediğiniz bağlantıyı tıklayıp tekrar kaydedin, sorunu çözer. WordPress, kaydederken htaccess'u yeniden yazar.

+0

Yönetici arka ucundan permalinks sayfasına eriştiğinizde, aslında bir permalink floş gerçekleştirir. –

1

İyi de, işte sizin için ne istediğinizi sağlayan bir kod bloğu.

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

    }   
} 

Notlar:

1) Eğer init kanca içinde init (eğer fonksiyonu herhangi bir ad verebilir) işlevini kullanarak emin olun.

2) wp-admin klasöründe options-permalink.php arayın.75 numaralı hattan başlayarak, bu cevabın temelini oluşturan bazı ilginç kodlar göreceksiniz.

3) ayrıca yukarıdaki kod elle kalıcı bağlantı yapısını seçmesini gerektirmez kodeks

bu article okuyabilirsiniz. Kullanılan herhangi bir permalink yapısı locale ile eklenir.

+0

Bu gece bunu kontrol edeceğim! ;) –

+0

Bu kod her zaman dil değiştirmek çünkü benim permalink gibi (kendi yapısına geçerli dilini ekler, hile yapmak görünmüyor böylece:/nl_NL/pl_PL/tr /% postname%) –

+0

Hmmm, Yapabilecekleriniz, önceden tanımlanmış bir yerel listeye karşı kontrol etmektir ve bu yerel ayar, $ permalink_structure öğesinde bulunuyorsa kaldırın ve yeni yerel ayarı ekleyin. Bu saf PHP olurdu. İkinci bir seçenek, WordPress ile uğraştığınız için, önceden ayarlanmış yerel ayarı bulunduran veritabanında bir seçenek saklamak olacaktır. Dili her değiştirdiğinizde, eklentiniz bu eski yerel ayarın $ permalink_structure'da olup olmadığını kontrol eder. Eğer yaparsa çıkarın. Eğer ikinci seçeneği tercih ederseniz, kodunuz $ permalink_structure = $ lang'den önce yerleştirilmelidir. $ permalink_structure' – MMK