どもです。
こっそり当ブログにコメントフォームを追加したところ、けっこう前に書きました、
1つの投稿から2つのURLとテンプレートで出力する・改
について、コメントをいただきました。
これの通りにやったけど上手くいかないというお話。
言われてみれば、これを完コピして上手く行くのは僕と同じ作り方をしているときに限られるか。
そう思いましたので、僕がこれを作ったときの方法を晒しておくことにしました。
Menu
用意するもの:プラグイン「Debug Bar」
これを有効化すると、管理ヘッダーの右側に「Debug」という項目が表示されますのでクリック。
こんな画面が出ます。
見るべきは一番下、「Matched Rewrite Query:」。
WordPressはクエリストリングスで表示ページを指定している
パーマリンクをデフォルトにしてWordPressを動かしてみたならご存知の話ですが、
WordPressは本来、クエリストリングスで表示ページを指定しています。
例えば、このページのMatched Rewrite Query:は、
category_name=web%2Fwordpress&p=2091&page=
これはリライトルール未適用のとき、
ドメイン名/index.php?category_name=web%2Fwordpress&p=2091&page=
で、このページが表示できるということです。
ホントはシングルページだと?p=2091だけで充分なのですが、Matched Rewrite Queryに従っても表示可能です。
functions.phpへの記載ルール
です。
この追加URLはドメイン/以下で、最後はスラッシュで〆ます。
つまり、「ドメイン/en/xxxx/yyyy」というURLが良いなら「'en/xxxx/yyyy'」といった感じ。
で、このURLには正規表現が使えます。故に、
/posttype/([^/]+)/ → /posttype/任意の文字列/
という意味になります。
クエリストリングス側では、正規表現で指定された文字列が$matchesという配列に格納されます。故に、
add_rewrite_rule('([^/]+)/([^/]+)/?$', 'index.php?$matches[1]&$matches[2]', 'top');
という感じで対応します。
実践・functions
では、あるカスタム投稿のシングルページでMatched Rewrite Queryを確認してみます。
↓
post_type=カスタム投稿名&slug=カスタム投稿のrewrite&p=ページID&page=
この中で、可変になる部分はページID一箇所のハズです。
ですので、リライトの右側は、
とすると、productというカスタム投稿のシングルページを表すクエリストリングスになります。
ここに、追加するクエリストリングスを書きます。
これで良し。
次に、これに対応させるURLを指定します。
シングルページのパーマリンクが「カスタム投稿名/記事ID」である場合、
カスタム投稿名/([0-9]+)/ とすると記事シングルページを指定するので、
en/カスタム投稿名/([0-9]+)/ とすれば、あたかも大きな/en/ディレクトリ中にカスタム投稿が入っている見た目になります。
これを左右繋げて、
'index.php?post_type=product&slug=product&p=$matches[1]&page=&en', 'top');
ミッションコンプリートです。(`・ω・´)ゞ
もしもコピペする場合は、途中の改行は消しておいてくださいw
余談ですが、add_rewrite_rule('URL','ストリングス','top')のtopはリライトルールのどこに追加するかという指定です。
他のルールに割り込んで、一番優先させるためにtopにします。
テンプレートの方はURL取得→分岐するだけ
以上の工程で完了したのは、新しいURLを適用させるまで。
このままだと、どちらのURLでもsingle.phpを読んで終わりなので、使用するテンプレートを分岐させようと思います。
<?php
$data = $_SERVER["REQUEST_URI"]; list($domain,$dir_01) = explode("/",$data);
if( $dir_01 == 'en' ): get_template_part('/en/有のときのテンプレート');
else: get_template_part('/en/なしのときのテンプレート');
endif;
?>
$_SERVER["REQUEST_URI"]でURLを取得し、スラッシュで分離。
ドメイン下のURLが「en」かそうでないかで、テンプレートを分岐させます。
注意:パーマリンクの空更新を忘れずに
リライトルール変更は、パーマリンクを更新しなければ反映されません。
空更新を忘れないようお気をつけください。