2012-03-15 8 views
5

私は現在、フランス語で提供するオプションが必要なワードプレスサイトで作業しています。私は、クエリーストリング変数lを追加すると、fr_FRのpoとmoファイルでテーマを動作させる方法を見つけました。 site.tld/?l=frは、フランス語の翻訳を提供するために、私のfunctions.phpに以下のコードをアクティブにする一方、すなわちWordpressのパーマリンクがカスタムURLの書き換えを無視する方法

site.tldは、バニラ、英語サイトを生成します:

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

このセットアップはすでに取り組んでいます。私の質問は次のとおりです。site.tld/?l=frの代わりにURLを書き換えるにはどうすればいいですか?frというフォルダ構造、つまりsite.tld/fr/を付け加えることができますか?

英語のようにsite.tld/portoflio/autumn/のページがあると、site.tld/fr/portfolio/autumn/はフランス語を吐き出します。私はこのアイデアをアップルのウェブサイトから入手しました。ここで、言語は常にフォルダ構造の先頭に置かれています。

私はすでに、これはhtaccessファイルで外部へのリダイレクトを実現することができます。

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

これは動作しますが、私はRフラグを削除すると、それはisntead見つからないフランス語翻訳404を提供しています。私はかなりのパーマリンクを使用する必要があるので、私は何をしたのかはワードプレスのルールを書き換えていると推測しています。今すぐ私は管理者の一般的なオプションでMonth and name/%year%/%monthnum%/%postname%/)を使用するように設定されています。

私の質問は、wordpressを/fr/の部分を無視して、正しいページ/投稿/その他を提供するにはどうすればよいですか?

これも可能ですか?私はここで正しい道にいますか?私はあなたの助けが必要です。特に、賢明ではなく、賢明なことをやってください。私はこれを試しましたhttp://pmg.co/a-mostly-complete-guide-to-the-wordpress-rewrite-api私の人生のために私はそれを動作させることはできません。 :/


UPDATE:私は、その後、@からルールを追加して、私のルールは.htaccess

から缶詰されたことを確認した

:[OK]をので、ここで以下@reluからヒントを取って、いくつかの進展がありますReluさんはいつも同じアドレスに私を送ってくれたので、次のように言います。/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; 
    } 
?> 

アドレスバーに今/fr滞在、それは良いことだが、二つの問題が解決しないので:

  1. WordPressは私のメインのインデックスページを提供しています。ルールの一部である&q=$matches[2]を使用していないようです。および

  2. ロケールはまだ適切に設定されていません。変数lが供給されているかどうかを確認したので、echo 'l: $l';$l = get_query_var('l');の後に追加しました。興味深いことに2つのエコーが得られます:l:とすぐ後のl: frです。 localeフィルタが2回実行されていますか?初めてqueryvarの値が表示されないように見えて、次にとfrが既に出力されているように見えます。その日の終わりにはまだロケールは変更されません。

aaaah helpです。


FINAL UPDATE:欲求不満の私の最後の息で私は再び探索し、このプラグインqtranslateを発見しました。私が必要とすることをします。感謝するよ、@ reluの叙事詩的な努力とstayin pow'rへのesp。

答えて

3

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

はこれをテストしていない、あなたのfunctions.phpにこれを追加し、それはいくつかの調整が必要な場合がありますが、これはそれを行う方法です。

基本的には、見つかったバージョンをhereに適合させました。

あなたはそれを呼び出すことで値だ得ることができるので、それはまた、 "リットル" クエリVARを登録します。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:上記を無視!


my_insert_query_vars()フィルターを外してそれを置き換える:ここ

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

は、私はWordPressの$wp_rewrite->rulesを見て、この特殊なケースに合うようにそれらを適応してきた、また、ページや記事の更新された書き換えます:

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

うわー、私はこれを見ました。ありがとう!!私はこれらを追加するときに、彼らは '/ fr'hmmなしのリンクに私を連れて行きます。どんな考えですか? am clueless atm –

+0

これらのルールを.htaccessから削除しましたか?彼らは必要ではありません! – relu

+0

yeap、そうだ..私はまた、ワードプレスのrwrulesがそこにあることを確かめた。その間に私達ができるsum'nがあれば余りにも分かります。ありがとう、 'それは人をpreciate! –

0

おそらくトピックの外に書き換えルールがあります。 en_us /またはjp/

add_rewrite_rule('^([a-z]{2}_[A-Z]{2}|^[a-z]{2})/?$', 'index.php?l=$matches[1]', 'top'); 
関連する問題