ど素人から毛を生やす。<延>

1つの投稿から2つのURLとテンプレートで出力・解説

Web > WordPress 2016年2月2日(最終更新:1年前)

このページは2016.2.2に作成されています。時代の流れとそぐわない可能性があったり、僕が今以上のど素人だった頃の記事だったりするので、新しい記事を探してみるのも良いかもしれません。

どもです。

こっそり当ブログにコメントフォームを追加したところ、けっこう前に書きました、
1つの投稿から2つのURLとテンプレートで出力する・改
について、コメントをいただきました。

これの通りにやったけど上手くいかないというお話。
言われてみれば、これを完コピして上手く行くのは僕と同じ作り方をしているときに限られるか。

そう思いましたので、僕がこれを作ったときの方法を晒しておくことにしました。

用意するもの:プラグイン「Debug Bar」

これを有効化すると、管理ヘッダーの右側に「Debug」という項目が表示されますのでクリック。

h280202

こんな画面が出ます。
見るべきは一番下、「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への記載ルール

add_rewrite_rule('追加したいURL?$', 'index.php?クエリストリングス', 'top');

です。
この追加URLはドメイン/以下で、最後はスラッシュで〆ます。
つまり、「ドメイン/en/xxxx/yyyy」というURLが良いなら「'en/xxxx/yyyy'」といった感じ。

で、このURLには正規表現が使えます。故に、

/page/([0-9]+)/ → /page/任意の数値/
/posttype/([^/]+)/ → /posttype/任意の文字列/

という意味になります。

クエリストリングス側では、正規表現で指定された文字列が$matchesという配列に格納されます。故に、

add_rewrite_rule('([^/]+)/?$', 'index.php?$matches[1]', 'top');
add_rewrite_rule('([^/]+)/([^/]+)/?$', 'index.php?$matches[1]&$matches[2]', 'top');

という感じで対応します。

実践・functions

では、あるカスタム投稿のシングルページでMatched Rewrite Queryを確認してみます。

post_type=product&slug=product&p=575&page=

post_type=カスタム投稿名&slug=カスタム投稿のrewrite&p=ページID&page=

この中で、可変になる部分はページID一箇所のハズです。
ですので、リライトの右側は、

post_type=product&slug=product&p=$matches[1]&page=

とすると、productというカスタム投稿のシングルページを表すクエリストリングスになります。
ここに、追加するクエリストリングスを書きます。

post_type=product&slug=product&p=$matches[1]&page=&en

これで良し。
次に、これに対応させるURLを指定します。

シングルページのパーマリンクが「カスタム投稿名/記事ID」である場合、
カスタム投稿名/([0-9]+)/ とすると記事シングルページを指定するので、
en/カスタム投稿名/([0-9]+)/ とすれば、あたかも大きな/en/ディレクトリ中にカスタム投稿が入っている見た目になります。

これを左右繋げて、

add_rewrite_rule('en/product/([0-9]+)/?$',
'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」かそうでないかで、テンプレートを分岐させます。

注意:パーマリンクの空更新を忘れずに

リライトルール変更は、パーマリンクを更新しなければ反映されません。
空更新を忘れないようお気をつけください。

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった  (0)
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (1)