web-dev-qa-db-ja.com

各URLに言語/国コードを追加

私は成功しないで一見単純なパーマリンク構造のカスタマイズを達成しようとしてきました。目標は、可能な各固定リンクの前に常に/aa-bb/を置くことです。ここで、aaは言語コード、bbは国コードです。これ以降の動作は通常どおりに動作します。ですから、あなたが通常/post-title/を持っていたところで、その後は/en-gb/post-title/を持っていれば同じ投稿になるでしょう(ページ、CPT、アーカイブ、カテゴリ、検索などのすべてのバリエーションを含む).

完全な流れ:

  1. 有効な言語/国の値のリストを生成します。= complete
  2. URLから値を取得して言語を決定します/ country = complete
  3. Template_redirectアクションフックの間、有効な値が存在しない場合はデフォルトの言語/国にリダイレクトします。= complete
  4. 最初の部分が存在しなかったかのようにこれらのURLを処理するためのパーマリンク書き換え構造を設定します。= ミステリー

WPパーマリンクを書き換えるためのすべての方法は、この目標とは少し異なる動作をするようです。これはhtaccessを使ったほうがよいでしょうか。 WPMLは彼らの言語コードでうまくいっているようですが、どうやっていいのかわかりません。

Add_rewrite_ruleを使用してもうまくいきますが、一度に1つのパーマリンクタイプしかカバーしないので、すべてのバリエーションを手動で追加するのでは不十分になるのが怖いのです。

2
Berend

私は今同じような解決策に取り組んでいます - ウェブサイトはすべてのURL(デフォルト言語を除く)に言語コードを持たなければなりません、しかしWPML/Polylangプラグインがそうする方法で翻訳可能なページだけです。ニュース(ブログ)については、特定の言語で投稿を表示するだけです(それらは別々であり、お互いの翻訳ではありません)。他のすべてのコンテンツはすべての言語で混在しています。また、UIもURLから設定された言語で表示されます。

これらの書き換え規則に言語コードを追加するために私がしたことは次のとおりです。

function prepend_default_rewrite_rules( $rules ) {

    // Prepare for new rules
    $new_rules = [];

    // Set up languages, except default one
    $language_slugs = ['ar', 'ku'];

    // Generate language slug regex
    $languages_slug = '(?:' . implode( '/|', $language_slugs ) . '/)?';


    // Set up the list of rules that don't need to be prefixed
    $whitelist = [
        '^wp-json/?$',
        '^wp-json/(.*)?',
        '^index.php/wp-json/?$',
        '^index.php/wp-json/(.*)?'
    ];

    // Set up the new rule for home page
    $new_rules['(?:' . implode( '/|', $language_slugs ) . ')/?$'] = 'index.php';

    // Loop through old rules and modify them
    foreach ( $rules as $key => $rule ) {

        // Re-add those whitelisted rules without modification
        if ( in_array( $key, $whitelist ) ) {

            $new_rules[ $key ] = $rule;

        // Update rules starting with ^ symbol
        } elseif ( substr( $key, 0, 1 ) === '^' ) { 

            $new_rules[ $languages_slug . substr( $key, 1 ) ] = $rule;


        // Update other rules
        } else {

            $new_rules[ $languages_slug . $key ] = $rule;

        }
    }


    // Return out new rules
    return $new_rules;
}
add_filter( 'rewrite_rules_array', 'prepend_default_rewrite_rules' );

十分にテストしていません - WP_Rewriteクラスを検討した後に解決策を思いついたのです。それは進行中の作業です。それが役立つことを願っています。

P.S .:また、「URLから値を取得して言語/国=完全を判断する」というあなたの解決策を見てうれしいです - それが私が現在取り組んでいるものです:)

2
Ihor Vorotnov

polylang plugin を使うことができると思います。あなたがそのプラグインで述べたように私は私のプロジェクトの1つを作りました。

0
por