Quy tắc viết lại cho trang web đa ngôn ngữ, như qTransTable?


8

Tôi muốn viết plugin nhỏ của riêng tôi để chuyển đổi ngôn ngữ. Đối với điều đó, điều đầu tiên sẽ là để các quy tắc viết lại chạy. Tôi đã tìm kiếm trên mạng trong 2 giờ, nhưng tôi chưa thể tìm thấy câu trả lời cho câu hỏi của mình.

Tôi muốn có nó như thế này: http://www.mysite.com/de/post-title/hoặchttp://www.mysite.com/de/projects/project-title/

Vì vậy, về cơ bản, những gì tôi đang cố gắng làm là giữ url hiện tại và tất cả các tham số của nó, chỉ cần thêm đoạn ngôn ngữ hiện đang hoạt động giữa url trang web và đường dẫn. Đây là mã của tôi cho đến nay:

function rewrite_rule_de(){
    add_rewrite_tag('%lang%','([^&]+)');
    add_rewrite_rule('^de/(.+?)/?$', 'index.php?p=$matches[1]&lang=de', 'bottom');
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}
add_action('init', 'rewrite_rule_de');

Một gợi ý nhỏ cho plugin này , đó là công việc đó, bao gồm cả việc viết lại cho mỗi ngôn ngữ.
bueltge

Câu trả lời:


10

Tôi đã nhận được ngay bây giờ, Sau khi tìm kiếm nhiều tài nguyên:

function lang_support() {
    return array('en','fr'); // Add your support lang-code (1st place is a default)
}

function rewrite_lang(){
    $langs = lang_support();
    foreach($langs as $lang) {
        add_rewrite_endpoint($lang,EP_PERMALINK|EP_PAGES|EP_ROOT|EP_CATEGORIES);
    }
}
add_action('init','rewrite_lang');

function lang(){
    global $wp_query;
    $langs = lang_support();
    $lang_r = "";
    foreach($langs as $lang) {
        if(isset($wp_query->query_vars[$lang])) {
            $lang_r = $lang;
            $_SESSION['lang'] = $lang_r;
        }
    }
    if(in_array($lang_r,$langs)) {
        return $lang_r;
    } else {
        return $langs[0];
    }
}

function init_session(){session_start();}
add_action('init','init_session',1);

function lang_session() { // Redirect by JS if session is set
    $url_lang= basename($_SERVER['REQUEST_URI']);
    if(!in_array($url_lang,lang_support()) && isset($_SESSION['lang'])) {
        if(!is_404()) {
          wp_redirect(currentURL().$_SESSION['lang'],301);
          exit;
        }
    }
}
add_action('wp_head','lang_session');

function output_buffer() {ob_start();}
add_action('init','output_buffer');

function currentURL() {
    $pageURL=(@$_SERVER["HTTPS"]=="on")?"https://":"http://";
        if($_SERVER["SERVER_PORT"]!="80"){
            $pageURL.=$_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
        }else{
            $pageURL.=$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
        }
        return $pageURL;
}

Thêm mã này vào functions.php. Sau khi thêm mã đi đến wp-admin/options-permalink.phpvà nhấnSave Changes

Vì vậy, bây giờ bạn có thể kiểm tra / sử dụng mã lang trong mẫu của bạn như ..

<?php echo lang();?>

hoặc là if( lang() === "en" )

Ví dụ các url làm việc với mã ví dụ của tôi:

http://domain.com/ <-- "en"
http://domain.com/en/ <-- "en"
http://domain.com/fr/ <-- "fr"
http://domain.com/es/ <-- "en" (coz , "es" code not set)

http://domain.com/mypage/ <-- "en" (work with "page")
http://domain.com/mypage/fr/ <-- "fr"
http://domain.com/mypage/es/ <-- "en" (coz , "es" code not set)

http://domain.com/mypost/ <-- "en" (work with "post")
http://domain.com/mypost/fr/ <-- "fr"
http://domain.com/mypost/es/ <-- "en" (coz , "es" code not set)

Ý tưởng tốt hơn / sửa lỗi / tìm thấy lỗi + lỗi? https://gist.github.com/l2aelba/5244912


1
Chà, các hàm đơn giản với tên chung như vậy sẽ nhanh chóng đưa ra xung đột. Nên được thêm tiền tố hoặc gói trong một không gian tên giả (lớp). Và để kiểm tra SSL an toàn hơn, hãy kiểm tra ý chính này .
kaiser

2
Điều này thật tuyệt, cảm ơn rất nhiều l2aelba! Mặc dù tôi sẽ dùng thử như thế này, cách tiếp cận „cổ điển hơn sẽ là có mã ngôn ngữ luôn ở phía trước phần còn lại của liên kết, ví dụ [home_url] [lang] [mypost] hoặc„ domain.com/en/ trang của tôi". Bất kỳ ý tưởng về làm thế nào để thực hiện điều này?
rassoh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.