2012-03-15 30 views
5

Tôi hiện đang làm việc trên một trang wordpress cần phải có tùy chọn để được cung cấp bằng tiếng Pháp. Tôi đã tìm thấy một cách để làm cho chủ đề làm việc với các tập tin po và po fr_FR khi tôi thêm một biến truy vấn l. ví dụ:Làm thế nào để làm cho permalinks Wordpress bỏ qua url tùy chỉnh viết lại

site.tld sẽ mang lại các trang web tiếng Anh vani, trong khi site.tld/?l=fr sẽ kích hoạt đoạn mã sau vào functions.php của tôi để phục vụ dịch tiếng Pháp:

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

thiết lập này đã được làm việc. câu hỏi của tôi là: làm thế nào để tôi viết lại url để thay vì site.tld/?l=fr tôi chỉ có thể thêm cấu trúc thư mục với fr tức là site.tld/fr/?

như vậy nếu có trang site.tld/portoflio/autumn/ bằng tiếng Anh, site.tld/fr/portfolio/autumn/ sẽ nhổ ra tiếng Pháp. tôi có ý tưởng này từ trang web của Apple, nơi ngôn ngữ luôn được thêm vào cấu trúc thư mục.

tôi đã có thể làm cho điều này xảy ra với một chuyển hướng bên ngoài trong htaccess:

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

làm việc này, nhưng một khi tôi loại bỏ các R cờ nó phục vụ các Pháp-dịch 404 không tìm thấy isntead. Tôi đoán những gì tôi đã làm là rối tung lên với các quy tắc viết lại wordpress bởi vì tôi cần phải sử dụng khá permalinks. ngay bây giờ tôi được thiết lập để sử dụng Month and name (/%year%/%monthnum%/%postname%/) trong các tùy chọn chung quản trị.

câu hỏi của tôi là, làm thế nào để tôi làm cho wordpress bỏ qua phần /fr/ và vẫn phục vụ đúng trang/bài/etc?

điều này có thể thực hiện được không? tôi đang đi đúng đường ở đây phải không? tôi cần sự giúp đỡ của bạn đặc biệt là làm những gì WISE và không chỉ là những gì NICE. tôi đã thử điều này http://pmg.co/a-mostly-complete-guide-to-the-wordpress-rewrite-api nhưng đối với cuộc sống của tôi tôi không thể làm cho nó hoạt động. :/


CẬP NHẬT: ok, vì vậy đây là một số tiến bộ được ý tưởng từ @relu dưới đây:

tôi đã đảm bảo rằng quy tắc của tôi đã được đóng hộp từ .htaccess

i sau đó thêm vào các quy tắc từ @ relu nhưng theo cách sau, bởi vì Relu luôn gửi tôi đến cùng một địa chỉ mà không cần /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; 
    } 
?> 

nay là /fr trú trong thanh địa chỉ, vì vậy đó là một điều tốt, nhưng hai vấn đề tồn tại:

  1. wordpress đang phục vụ cho tôi những trang danh mục chính. có vẻ như nó không sử dụng phần &q=$matches[2] của quy tắc; và

  2. ngôn ngữ vẫn chưa được đặt chính xác. tôi đã kiểm tra xem biến số l có được nạp hay không, vì vậy tôi đã thêm echo 'l: $l'; sau $l = get_query_var('l'); và thú vị là tôi nhận được hai âm vang: một l: và một số khác l: fr ngay sau đó. bộ lọc locale đang chạy hai lần?có vẻ như lần đầu tiên nó không nhìn thấy giá trị của queryvar, và sau đó có vẻ là một lần thứ hai nó kết quả đầu ra l: với fr đã có trong đó .. vào cuối ngày miền địa phương vẫn không được thay đổi .

trợ giúp aaaah.


CUỐI CÙNG CẬP NHẬT: trong hơi thở cuối cùng của tôi về sự thất vọng tôi đã tìm kiếm một lần nữa, và thấy Plugin qtranslate này. làm những gì tôi cần. cảm ơn y'all, đặc biệt là nỗ lực sử thi của @ relu và stayin pow'r.

Trả lời

3

Thêm phần này vào functions.php của bạn

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

Chưa thử nghiệm điều này, nó có thể cần một số tinh chỉnh, nhưng đây là cách để làm điều đó.

Về cơ bản, tôi đã điều chỉnh phiên bản được tìm thấy here.

Nó cũng đăng ký các "l" var query vì vậy bạn có thể nhận được giá trị của nó bằng cách gọi: 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: Bỏ qua ở trên!


Tháo bộ lọc my_insert_query_vars() và thay thế bằng:

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

Dưới đây là cũng là viết lại cập nhật cho các trang và các bài viết, tôi đã nhìn WordPress' $wp_rewrite->rules và thích nghi cho họ để phù hợp với trường hợp đặc biệt này :

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 xin lỗi tôi vừa thấy điều này. cảm ơn!! ok, vì vậy khi tôi thêm những, họ chỉ đưa tôi trở lại liên kết mà không có '/ fr' hmm .. bất kỳ suy nghĩ? am clueless atm –

+0

Bạn đã xóa các quy tắc đó khỏi .htaccess chưa? Họ không cần thiết! – relu

+0

yeap, đã làm như vậy .. tôi cũng chắc chắn rằng chỉ có 'rwrules wordpress là ở đó .. sẽ cho bạn biết càng sớm càng tốt khi tôi nhận được nó để làm việc. trong khi chờ đợi cũng nên biết nếu có sum'n khác chúng ta có thể làm. cảm ơn nhiều, 'tiền thân nó! –

0

có thể nằm ngoài chủ đề nhưng đây là quy tắc viết lại khác cho ngôn ngữ của biểu mẫu; vi_us/hoặc jp/

add_rewrite_rule('^([a-z]{2}_[A-Z]{2}|^[a-z]{2})/?$', 'index.php?l=$matches[1]', 'top'); 
Các vấn đề liên quan