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

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

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

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

PHP

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

Q&A

解決済

1回答

5881閲覧

固定ページのパーマリンクと、カスタム投稿タイプのパーマリンクの、前半部分をを同じにしたい

退会済みユーザー

退会済みユーザー

総合スコア0

WordPress

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

PHP

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

0グッド

0クリップ

投稿2016/09/17 16:17

固定ページのパーマリンクと、カスタム投稿タイプのパーマリンクの、前半部分をを同じにしたいです。

下の図のような感じです。
イメージ説明
固定ページのパーマリンクはこう。
http://example.com/customtype1」

カスタム投稿タイプのパーマリンクはこう。
http://example.com/customtype1/test1」
http://example.com/customtype1/test2」

そんなかたちが理想です。(test1というのは記事名です。)

しかし!
なぜか、一方を設定すると、もう一方がいきません。

固定ページのパーマリンクを先に設定すると、カスタム投稿タイプのページが表示されません。
逆にカスタム投稿タイプのパーマリンクを設定すると、固定ページが表示されないのです。

これはひょっとして、仕方ないことなのでしょうか?
上の図のように、前半部分を同じにっていうのは、そもそもできないことなのでしょうか?

いちおう現在のfunction.phpの記述を載せておきます。
解決策をご存知の方がいらっしゃいましたら、よろしくお願いいたします。m(__)m

php

1// カスタム投稿タイプの追加 2add_action( 'init', 'custum_post_type' ); 3function custum_post_type() { 4 //カスタム投稿1追加 5 register_post_type( 'customtype1', 6 array('labels' => 7 array( 8 'name' => __( 'customtype1' ), 9 'singular_name' => __( 'customtype1' ) 10 ), 11 //投稿タイプの設定 12 'public' => true, 13 'menu_position' => 5, 14 'hierarchicla' => false, 15 'has_archive' => true, 16 17 //投稿編集ページの設定 18 'supports' => array('title','editor','thumbnail', //タイトル,編集,アイキャッチ 19 'custom-fields','excerpt','author','trackbacks', //カスタムフィールド,抜粋文&作成者,トラックバック 20 'comments','revisions','page-attributes') //コメント,リビジョン,作成者,表示順のボックス 21 ) 22 ); 23 //カスタム投稿2追加 24 register_post_type( 'customtype2', 25 array('labels' => 26 array( 27 'name' => __( 'customtype2' ), 28 'singular_name' => __( 'customtype2' ) 29 ), 30 //投稿タイプの設定 31 'public' => true, 32 'menu_position' => 6, 33 'hierarchicla' => false, 34 'has_archive' => true, 35 36 //投稿編集ページの設定 37 'supports' => array('title','editor','thumbnail', //タイトル,編集,アイキャッチ 38 'custom-fields','excerpt','author','trackbacks', //カスタムフィールド,抜粋文&作成者,トラックバック 39 'comments','revisions','page-attributes') //コメント,リビジョン,作成者,表示順のボックス 40 ) 41 ); 42} 43

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

前置き

投稿タイプテンプレート - WordPress Codex 日本語版
https://wpdocs.osdn.jp/%E6%8A%95%E7%A8%BF%E3%82%BF%E3%82%A4%E3%83%97%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88

まず先に、固定ページを使わずにカスタム投稿タイプのアーカイブページをカスタマイズする方法を提示しておきます。WordPressのテンプレートファイルの中にarchive.phpというものがありますが、これとは別にarchive-カスタム投稿タイプ名.phpというファイルを用意しておくと対応するカスタム投稿タイプのインデックスではこちらのテンプレートが適用されるようになります。WordPress標準の機構なので特に気を遣うところもなくお手軽です。ただ、場合によっては固定ページのほうが都合がいいこともあると思います。というわけで本題です。

原因

WordPressにはリライトルールというものがあります。これはリクエストURIから表示するページを決定するためのルールで、デバッグ系プラグインを利用するほかに、下記コードをテンプレートの適当なところに貼り付ける事でも内容をのぞく事ができます。

php

1<pre> 2<?php var_dump( get_option( 'rewrite_rules' ) ); ?> 3</pre>

ルールは上から順に評価され、ここで確認すると分かるのですが、カスタム投稿タイプのアーカイブに対応するルール(例)customtype1/?$は優先度が高いはじめの方、個別ページに対応する(.?.+?)(?:/([0-9]+))?/?$は最後に定義されているはずです。つまり、カスタム投稿タイプのスラッグと個別ページのスラッグがかぶっている場合、アーカイブURIへのリクエストは必ずcustomtype1/?$に拾われて、個別ページのほうには絶対にたどりつけません。この状態を解消するために、より優先度の高いルールを追加してリクエストを奪い返します。

対応

以下をfunctions.phpに追加後、設定 > パーマリンク設定 で変更を保存をクリック
customtype\dの部分は実際のスラッグに合わせて適宜変更してください。
これでカスタム投稿タイプのアーカイブを無効化する形で、個別ページにアクセスできるようになるはずです。

php

1/** 2* 先頭から末尾までがcustomtype[数字一桁]で終わる場合、ページに転送 3* というルールを優先度topで追加 4**/ 5add_action( 'init', function() { 6 add_rewrite_rule( '^(customtype\d)/?$', 'index.php?pagename=$matches[1]', 'top' ); 7}, 0 );

参考

WordPress の表示ロジックを理解する – Reloaded
https://www.prime-strategy.co.jp/wp/2499/

投稿2016/09/18 07:45

nnssn

総合スコア1221

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/09/18 09:59

すごい。。必要な項目がすべてそろってる…汗 わかりやすいご回答、まことにありがとうとうございます。 今回は固定ページのほうが都合がいいので、最後のを張り付けて対応したいと思います。 ただ、すみません。 3つよろしいでしょうか? ①「\」のマークが、「/の逆」のマークになってしまうのですが、問題ないですしょうか ②function.phpのどのあたりに張り付けるのがいいでしょうか?質問のコードの外でしょうか?それとも中のどこかですか? ③外や中のいろんな場所に張り付けてみたのですが、やはり、『固定ページ』が表示されず、『customtype○の記事一覧』が表示されてしまいます。張り付ける位置以外に注意事項はありますでしょうか? 以上です。 たびたび申し訳ございませんが、ご回答いただければ幸いでございます。<m(__)m>
nnssn

2016/09/18 10:50 編集

① /の逆(バックスラッシュ)は意図したとおりです、問題ありません。 ② どこでもOKですが、ファイルの一番最後に足しておけば間違いがないと思います。 確認するとしたら ・コード追加後に、パーマリンク設定画面から「変更を保存」をしたか ・カスタム投稿タイプのスラッグは「customtype数字一桁」になっているか あたりです。 それでもダメな場合、使用プラグインや使用テーマの機能が干渉しているのかもしれません。プラグインの停止、デフォルトテーマでのテストなどを試してみてください。あと「原因」のところに書いたコードを貼ってみる方法も。コードが機能しているなら、ひとつめのルールにcustomtypeという文字列が含まれているはずです。 追記:手元の環境で試したら期待したとおりの動作になりました。
退会済みユーザー

退会済みユーザー

2016/09/18 12:22

>手元の環境で試したら期待したとおりの動作になりました。 うう。。親身になってくださってありがとうとざいます!! 『質問内容は』解決いたしました! 貼り付けるときに(customtype\1)とかにしておりました…汗 …ただ、なんと。 『質問のコードが一部不足』しておりました… customtype1と2があるのですが、実はパーマリンクをcustom1と2に変更したいと思ったので、質問のコードには下記コードが加わっております。 //パーマリンクを /custom1/投稿名/ にします。 'rewrite' => array(  'slug' => 'mainmenu1' ), 『上記コードがない状態』ならば解決したのですが、『ある状態』だとダメでした。 大変恐縮ですが、これについて22時に別途リクエストさせていただきます。 夕ご飯食べたあとにもしお時間ございましたら、少しご覧いただければ幸いです。m(__)m ※もし、「もう答えたくないよ」とか「それなら簡単だから別途質問は不要だよ」ということでしたら、このスレッドでご返信くださいませ。
退会済みユーザー

退会済みユーザー

2016/09/18 12:27

customtype1や2を、custom1や2っていう風に変更したいのなら、 register_post_type( 'customtype1', の部分を register_post_type( 'custom1', にすればいいじゃん。 と思われるかもしれませんが、ここは変更できないです。 すでに大量の記事がございまして…(´;ω;`) なので、 'rewrite' => array(  'slug' => 'custom1' ), で変更させながら、質問内容をクリアしたいのです。。 (わ、ちょっとワガママがすぎますね。。)
nnssn

2016/09/18 13:08 編集

add_rewrite_rule( '^(customtype\d)/?$', 'index.php?pagename=$matches[1]', 'top' ); この部分は、uriが「customtype数字」だったらそれをpagenameとして固定ページを探すという意味合いです。なので、 typeを削ればリライト後のスラッグcustom数字で引っ張ってこれるはずです。 '^(customtype\d)/?$' // before '^(custom\d)/?$' // after
退会済みユーザー

退会済みユーザー

2016/09/18 13:12

うわぁ!すみません!! 今リクエストしようとしたら…ご返信いただいてしまいました。汗 時間を守れないダメなヤツであることがバレてしまいました。笑 ありがとうとうございます!ご提示の方法ですぐに試してまたこのスレッドからご報告いたします!('◇')ゞ
退会済みユーザー

退会済みユーザー

2016/09/18 13:18

やった!やったやったやったぁぁぁあーー!!!!できましたっ(^_-)-☆ 原因と対策とその理由まで書いてやってんだから、自分で推測してくれよ、という感じでしたね。汗 まことにありがとうございます。 nnssnさんのような方々がいらっしゃるから、私も別のQAサイトの専門分野について優しく回答できますわ。 ほんとうに、ほんとうにありがとうございます。
nnssn

2016/09/18 13:31

同じ単語が複数個所に出てくるので、初見だとどことどこが対応しているのか推測しづらいという部分もあると思います。とりあえずは問題が解決したようでなによりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問