質問: 固定ページのパーマリンクと、カスタム投稿タイプのパーマリンクの、前半部分をを同じにしたいです。 下の図のような感じです。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/6710ee45a7a1534e9e8ece01c38276f5.jpeg) 固定ページのパーマリンクはこう。 「http://example.com/customtype1」 カスタム投稿タイプのパーマリンクはこう。 「http://example.com/customtype1/test1」 「http://example.com/customtype1/test2」 そんなかたちが理想です。(test1というのは記事名です。) しかし! なぜか、一方を設定すると、もう一方がいきません。 固定ページのパーマリンクを先に設定すると、カスタム投稿タイプのページが表示されません。 逆にカスタム投稿タイプのパーマリンクを設定すると、固定ページが表示されないのです。 これはひょっとして、仕方ないことなのでしょうか? 上の図のように、前半部分を同じにっていうのは、そもそもできないことなのでしょうか? いちおう現在のfunction.phpの記述を載せておきます。 解決策をご存知の方がいらっしゃいましたら、よろしくお願いいたします。m(__)m ``` // カスタム投稿タイプの追加 add_action( 'init', 'custum_post_type' ); function custum_post_type() { //カスタム投稿1追加 register_post_type( 'customtype1', array('labels' => array( 'name' => __( 'customtype1' ), 'singular_name' => __( 'customtype1' ) ), //投稿タイプの設定 'public' => true, 'menu_position' => 5, 'hierarchicla' => false, 'has_archive' => true, //投稿編集ページの設定 'supports' => array('title','editor','thumbnail', //タイトル,編集,アイキャッチ 'custom-fields','excerpt','author','trackbacks', //カスタムフィールド,抜粋文&作成者,トラックバック 'comments','revisions','page-attributes') //コメント,リビジョン,作成者,表示順のボックス ) ); //カスタム投稿2追加 register_post_type( 'customtype2', array('labels' => array( 'name' => __( 'customtype2' ), 'singular_name' => __( 'customtype2' ) ), //投稿タイプの設定 'public' => true, 'menu_position' => 6, 'hierarchicla' => false, 'has_archive' => true, //投稿編集ページの設定 'supports' => array('title','editor','thumbnail', //タイトル,編集,アイキャッチ 'custom-fields','excerpt','author','trackbacks', //カスタムフィールド,抜粋文&作成者,トラックバック 'comments','revisions','page-attributes') //コメント,リビジョン,作成者,表示順のボックス ) ); } ```
回答: ### 前置き 投稿タイプテンプレート - WordPress Codex 日本語版 まず先に、固定ページを使わずにカスタム投稿タイプのアーカイブページをカスタマイズする方法を提示しておきます。WordPressのテンプレートファイルの中にarchive.phpというものがありますが、これとは別にarchive-カスタム投稿タイプ名.phpというファイルを用意しておくと対応するカスタム投稿タイプのインデックスではこちらのテンプレートが適用されるようになります。WordPress標準の機構なので特に気を遣うところもなくお手軽です。ただ、場合によっては固定ページのほうが都合がいいこともあると思います。というわけで本題です。 ### 原因 WordPressにはリライトルールというものがあります。これはリクエストURIから表示するページを決定するためのルールで、デバッグ系プラグインを利用するほかに、下記コードをテンプレートの適当なところに貼り付ける事でも内容をのぞく事ができます。 ``` ``` ルールは上から順に評価され、ここで確認すると分かるのですが、`カスタム投稿タイプのアーカイブ`に対応するルール`(例)customtype1/?$`は優先度が高いはじめの方、`個別ページ`に対応する`(.?.+?)(?:/([0-9]+))?/?$`は最後に定義されているはずです。つまり、カスタム投稿タイプのスラッグと個別ページのスラッグがかぶっている場合、アーカイブURIへのリクエストは必ず`customtype1/?$`に拾われて、個別ページのほうには**絶対にたどりつけません**。この状態を解消するために、より優先度の高いルールを追加してリクエストを奪い返します。 ### 対応 以下をfunctions.phpに追加後、設定 > パーマリンク設定 で**変更を保存をクリック**。 `customtype\d`の部分は実際のスラッグに合わせて適宜変更してください。 これでカスタム投稿タイプのアーカイブを無効化する形で、個別ページにアクセスできるようになるはずです。 ``` /** * 先頭から末尾までがcustomtype[数字一桁]で終わる場合、ページに転送 * というルールを優先度topで追加 **/ add_action( 'init', function() { add_rewrite_rule( '^(customtype\d)/?$', 'index.php?pagename=$matches[1]', 'top' ); }, 0 ); ``` ### 参考 WordPress の表示ロジックを理解する – Reloaded