質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.80%

カスタム投稿タイプのsingle-***.phpの読み込みがうまくいかない(add_rewrite_rule()の失敗?)

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,648

taaa

score 32

前提・実現したいこと

カスタム投稿タイプを作り、専用のsingle-***.phpを作ったが、反映されず
single.phpが読み込まれるわけでもなくトップページが表示されてしまう

最終的に目指すのは
http://hoge.com/animal/dog/123
でカスタム投稿タイプ「dog」に属するpostID=123の詳細ページを上記の専用テンプレートで表示することです
しかし、現実には上記のURLのまま、http://hoge.com/ のホームが表示されてしまいます

状況

カスタム投稿タイプ(dog)の専用投稿ページテンプレート(single-dog.php)が投稿ページで読み込まれない状況に悩んでいます

カスタム投稿タイプの設定とURL設定のために以下のコードをfunctions.phpに書いて試しているのですが
どこに問題があるのでしょうか

add_action( 'init', 'create_post_type_dog' );
function create_post_type_dog() {
    //投稿タイプ設定
    register_post_type( 'dog',
            array(
                'labels' => array(
                'name' => __( '犬' ),
                'singular_name' => __( '犬' )
            ),
            'public' => true,
            'publicly_queryable' => true,
            'hierarchical' => false,
            'exclude_from_search' => false,
            'query_var' => true,
            'has_archive' => true,
            'rewrite' => array('slug' => 'animal/dog', 'with_front'=>false)//archiveページのパス決定
        )
    );
}


//singleページのURLを決定
add_filter( 'post_type_link', 'my_post_type_link', 1, 2 );
function my_post_type_link( $link, $post ){
    if ( 'dog' === $post->post_type ) {
        return home_url( '/animal/dog/' . $post->ID .'/');
    } else {
        return $link;
    }
}


//画面はトップページを表示。URLはそのままhttp://hoge.com/animal/dog/1498/
add_action( 'init', 'my_rewrite_rules' );
function my_rewrite_rules() {
    add_rewrite_rule('animal/dog/([0-9]+)?$', 'index.php?p=$matches[2]', 'top');
    add_rewrite_rule('animal/dog/?$', 'index.php?post_type=dog', 'top');
}

補足

1)
/animal/ディレクトリはwpではなく、animalディレクトリがドキュメントルート下に実在している状況で、以下のような構成になっています
/
/animal/index.html
/wp/(wordpressディレクトリ)
2)
/animal/dog でアーカイブページの出力(archive-dog.php)は成功しています

補足情報(FW/ツールのバージョンなど)

wordpressは4.5.2です

どうぞよろしくお願いします

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

解決しました

まず、

add_rewrite_rule('^animal/dog/([0-9]+)/?$', 'index.php?p=$matches[2]', 'top');


の部分は以下が正解でした($matchesのindexの間違い)

add_rewrite_rule('^animal/dog/([0-9]+)/?$', 'index.php?p=$matches[1]', 'top');

これだけでは不十分で

add_rewrite_rule('^animal/dog/([0-9]+)/?$', 'index.php?post_type=dog&p=$matches[1]', 'top');


として、「post_type」をパラメータに追加する必要がありました
「p」で投稿IDさえつけてあげれば勝手に投稿タイプを判別してそれ用のテンプレートを
実行してくれるのかと思っていたらそうではなかったようです

こんなことに丸一日かけてしまい呆れました、お目汚し失礼しました
ご協力いただいたkei344さん、ありがとうございました

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

問題の切り分けにエラーページを作成してみては。

【404エラーページの作成 - WordPress Codex 日本語版】
https://wpdocs.osdn.jp/404エラーページの作成

【WordPressのデバッグプラグイン「Query Monitor」をサイト制作・カスタマイズに役立てよう | 東京上野のWeb制作会社LIG】
https://liginc.co.jp/web/wp/plug-in/151347

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/25 15:04 編集

    ご回答ありがとうございます
    ご紹介いただいたページにしたがって404ページを作って見ました
    その上で試すと、
    1)実際に存在するページを表示しようとするとそのページも404ページも表示されずにトップページが表示され
    2)実際に存在しないページを表示しようとしても同様になります

    これは、詳細ページを表示しようとするロジック自体が動作していないということでしょうか


    また、今、試しに
    ```PHP
    add_rewrite_rule('^animal/dog/([0-9]+)?$', 'index.php?p=$matches[2]', 'top');
    ```
    の部分を
    ```PHP
    add_rewrite_rule('^animal/dog/([0-9]+)?$', 'index.php?post_type=dog', 'top');
    ```
    のように変更したところ、正常にdog投稿タイプのアーカイブページがarchive-dog.phpテンプレートで
    表示されました

    ということは、変更前の
    add_rewrite_rule('^animal/dog/([0-9]+)?$', 'index.php?p=$matches[2]', 'top');
    の部分で間違いがあって、そのせいで詳細ページ表示ロジックが動いてないのでしょうか
    (正規表現に自信がないのですが自分ではわかりません)

    ご意見いただけると嬉しいです、よろしくお願いします

    キャンセル

  • 2019/02/25 16:09

    > ロジック自体が動作していないということでしょうか
    そうかもしれませんね。パーマリンクは更新(管理画面から変更せず保存)されていますか?
    add_rewrite_rule後には必ず実行しておかないと反映しません。

    その上で「Query Monitor」とかでどういう値が渡っているかを調査してみてください。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る