お忙しい中質問を閲覧していただきありがとうございます。
現在独学でWordPressを学習中なのですが、その最中、リライトルールというとても複雑な問題にぶつかってしまいました…
詳しい方がいらっしゃいましたら是非ご助力いただけたらと思います。
###前提・実現したいこと
--- 実現したいこと
各記事ページに詳細ページを設置したい。
例)
記事タイトル:サンプル1
記事スラッグ:sample1
パーマリンク:http://example.com/sample1/
詳細ページ :http://example.com/sample1/detail1/type1
上記を、
http://example.com/sample1/detail2/type1
http://example.com/sample3/detail3/type3
のように複数種類作ってみたいです。
最終的には、detail, type毎に使うテンプレートを変えて表示する予定です。
--- 前提
WordPress 4.7.8
PHP 7.0.18
使用テーマ SKT Design Agency
###現状
functions.phpに以下を追記し、テスト用固定ページ(スラッグ名:rewriterules)を作成しリライトルールの追加が出来るか試してみました。
add_action('init', 'my_add_single_tag_permastruct'); function my_add_single_tag_permastruct() { add_rewrite_tag("%detail%", '([^/]+)', "detail="); add_rewrite_tag("%type%", '([^/]+)', "type="); $single_struct = '/rewriterules/%detail%/%type%'; add_permastruct('mysingleperma', $single_struct, array("feed" => false)); }
この状態だと、http://example.com/rewriterules/detail1/type1/
にアクセスした際の404エラーは消えましたが、トップページが表示されている状態です。
下記はリライトルールに追加された内容です。
Rule | Rewrite | Source |
---|---|---|
rewriterules/([^/]+)/([^/]+)/page/?([0-9]{1,})/?$ | index.php?detail=$matches[1]&type=$matches[2]&paged=$matches[3] | mysingleperma |
rewriterules/([^/]+)/([^/]+)/?$ | index.php?detail=$matches[1]&type=$matches[2] | mysingleperma |
rewriterules/([^/]+)/page/?([0-9]{1,})/?$ | index.php?detail=$matches[1]&paged=$matches[2] | mysingleperma |
rewriterules/([^/]+)/?$ | index.php?detail=$matches[1] | mysingleperma |
ここからadd_rewrite_rule();を使用し、add_permastruct();で追加したルールを元にURLの書き換えを行うのだと思うのですが、そこのやり方に関しての参考サイトを上手く探すことが出来ませんでした…
また、現状で実装してみたものは固定ページのURLでしたが、これを記事ページでも行えるのでしょうか?
気になっている点は、add_permastruct();やadd_rewrite_rule();の中に記事のスラッグなどという可変的なモノを入れられるのか?ということです。
###試したこと
finctions.php
add_action('init', 'my_add_single_rewrite_rules'); add_filter('query_vars', 'my_add_single_query_vars1'); add_filter('query_vars', 'my_add_single_query_vars2'); function my_add_single_rewrite_rules() { add_rewrite_rule( 'rewriterules/?[^/]*/?[^/]*', 'index.php?pagename=rewriterules&detail=$matches[1]&type=$matches[2]', 'top' ); } function my_add_single_query_vars1($vars) { $vars[] = 'detail'; return $vars; } function my_add_single_query_vars2($vars) { $vars[] = 'type'; return $vars; }
この場合、http://example.com/rewriterules/detail1/type1/
にアクセスするとhttp://example.com/rewriterules/
と同じページが表示されましたが、固定ページ名の部分を記事スラッグに変えられないのではないかと思い、現状の方法に変えました。
###追記
--- 一応意図通り動いたコード
functions.php
add_action('init', 'my_add_single_rewrite_endpoint'); function my_add_single_rewrite_endpoint() { add_rewrite_endpoint('detail01', EP_PERMALINK, 'type'); add_rewrite_endpoint('detail02', EP_PERMALINK, 'type'); add_rewrite_endpoint('detail03', EP_PERMALINK, 'type'); }
これで記事ページのパーマリンクの最後に/detail01/xxx/
を付けてアクセスすると無事アクセスでき、最後のxxxの部分の文字列がtypeという名前のパラメータとして認識されるようになりました。
しかし、テンプレートに切り替えは、
<?php $url = $_SERVER['REQUEST_URI']; if (strstr($url, 'detail01')) { get_template_part('single-detail01'); }elseif (strstr($url, 'detail02')) { get_template_part('single-detail02'); }elseif (strstr($url, 'detail03')) { get_template_part('single-detail03'); }else { get_template_part('single-top'); }
というゴリ押し分岐で実装しています…笑
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/25 01:28
2017/12/25 02:18
2017/12/25 02:29