質問編集履歴

1 自分で試した内容を追記

Nerf.this

Nerf.this score 14

2017/12/25 10:28  投稿

【WordPress】各記事ページにそれぞれの詳細ページを設置したい。(リライトルール必須?)
お忙しい中質問を閲覧していただきありがとうございます。
現在独学で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/`と同じページが表示されましたが、固定ページ名の部分を記事スラッグに変えられないのではないかと思い、現状の方法に変えました。
この場合、`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');
}
```
というゴリ押し分岐で実装しています…笑
  • PHP

    36287 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    14548 questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る