WordPressで、通常の投稿やアーカイブページなどのURLは、ダッシュボードのパーマリンク設定ページで設定できます。
しかし、カスタム投稿タイプのURLに関しては、ダッシュボードでの設定はできませんし、思ったようなURL構成にするのが難しいです。
ここでは記事: カスタム投稿タイプの設定を踏まえながら、カスタム投稿タイプのパーマリンクを思い通りにカスタマイズする方法をまとめました。
記事: カスタム投稿タイプのパーマリンクを設定するプラグイン — Custom Post Type Permalinks
まず、URLを投稿名ベースにするか、数字ベースにするか?
最初に押さえておくポイントは、ダッシュボードのパーマリンク設定をデフォルト以外にした場合、カスタム投稿タイプのパーマリンクは常に投稿名(スラッグ)がベースになるという点です。
例えば、パーマリンク設定を数字ベースに設定します。
この設定で、カスタム投稿タイプの記事を作成してみますが、パーマリンクは数字ベースにはなりません。
パーマリンクが投稿名ベースだと、日本語のタイトルの記事はURLにも日本語を含んでしまうことになります。
URLには日本語を使いたくないというケースは多いと思います。
投稿毎に英字のスラッグを設定する事で回避する事は出来ますが、記事数が多くなる場合は面倒です。
ここでは、
- カスタム投稿タイプのパーマリンクを投稿名ベースにする
- カスタム投稿タイプのパーマリンクを数字ベースにする
という2通りのケースについて説明していきます。
パーマリンクを投稿名ベースにする場合
カスタム投稿タイプのパーマリンクを投稿名ベースにする場合、WordPressのデフォルトの挙動になりますので、難しくありません。
まず、functions.phpに以下のコードを追加して、カスタム投稿タイプを設定します。
1 2 3 4 5 6 7 8 9 10 11 |
add_action( 'init', 'my_post_type' ); function my_post_type() { register_post_type( 'news', array( 'label' => 'ニュース', 'public' => true, 'has_archive' => true, ) ); } |
アーカイブページ(記事の一覧ページ)が必要な場合は、必ず'has_archive'
をtrue
にします。
次に、ダッシュボードのパーマリンク設定ページを開き、設定をします。
いずれかの設定を選択し、変更を保存します。
※変更が無い場合でも、リライトルールを更新する必要があります。その場合、一度デフォルトに変更して保存した後、再度パーマリンクの設定を行ってください。
参照記事: パーマリンクの設定がうまく反映されない時の対処法
日付と投稿名、月と投稿名、投稿名のいずれかを選択した場合、カスタム投稿タイプのパーマリンクは、
のようになります。
余分なディレクトリを除去するための設定
ダッシュボードのパーマリンク設定ページで、数字ベースを選択した場合、カスタム投稿タイプのパーマリンクは、
のように、投稿タイプ名の前にarchivesディレクトリを挟む形になります。
また、カスタム構造で以下のように設定したとします。
この場合、通常の投稿とカスタム投稿のパーマリンクは、それぞれ、
通常の投稿:
http://my-site.com/blog/投稿名/
カスタム投稿:
http://my-site.com/blog/news/投稿名/
のようになります。
カスタム投稿のパーマリンクで、archivesディレクトリやblogディレクトリが必要ない場合は、functions.phpのregister_post_type
関数に、以下の設定を加えます。
1 2 3 4 5 6 7 8 9 10 11 12 |
add_action( 'init', 'my_post_type' ); function my_post_type() { register_post_type( 'news', array( 'label' => 'ニュース', 'public' => true, 'has_archive' => true, 'rewrite' => array('with_front' => false), ) ); } |
この設定を加える事により、
通常の投稿:
http://my-site.com/blog/投稿名/
カスタム投稿:
http://my-site.com/news/投稿名/
というパーマリンクになります。
パーマリンクを数字ベースにする場合
カスタム投稿タイプのパーマリンクを数字(投稿ID)ベースにします。
通常の投稿:
http://my-site.com/archives/123
カスタム投稿:
http://my-site.com/archives/news/123
まず、functions.phpに以下のコードを追加し、カスタム投稿タイプの設定を行います。
※前出のパーマリンクを投稿名ベースにする場合と同じコードです。
1 2 3 4 5 6 7 8 9 10 11 |
add_action( 'init', 'my_post_type' ); function my_post_type() { register_post_type( 'news', array( 'label' => 'ニュース', 'public' => true, 'has_archive' => true, ) ); } |
次に、functions.phpにさらに以下のコードを追加して、カスタム投稿タイプでも数字ベースのパーマリンクが使えるようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
add_filter( 'post_type_link', 'my_post_type_link', 1, 2 ); function my_post_type_link( $link, $post ){ if ( 'news' === $post->post_type ) { return home_url( '/archives/news/' . $post->ID ); } else { return $link; } } add_filter( 'rewrite_rules_array', 'my_rewrite_rules_array' ); function my_rewrite_rules_array( $rules ) { $new_rules = array( 'archives/news/([0-9]+)/?$' => 'index.php?post_type=news&p=$matches[1]', ); return $new_rules + $rules; } |
最後に、ダッシュボードのパーマリンク設定ページで、パーマリンクを設定して保存します。
変更が無い場合でも、リライトルールの更新を行ってください。
参照記事: パーマリンクの設定がうまく反映されない時の対処法
これでパーマリンクが数字ベースになりました。
余分なディレクトリを除去するための設定
newsディレクトリが、サイトルートの直下になるようにカスタマイズします。
ここでは、以下のようなパーマリンクになるように設定します。
通常の投稿:
http://my-site.com/blog/123
カスタム投稿:
http://my-site.com/news/123
まず、register_post_type
関数に、以下の設定を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 |
add_action( 'init', 'my_post_type' ); function my_post_type() { register_post_type( 'news', array( 'label' => 'ニュース', 'public' => true, 'has_archive' => true, 'rewrite' => array('with_front' => false), ) ); } |
次に、post_type_link
フィルタとrewrite_rules_array
フィルタを、以下のように変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
add_filter( 'post_type_link', 'my_post_type_link', 1, 2 ); function my_post_type_link( $link, $post ){ if ( 'news' === $post->post_type ) { return home_url( '/news/' . $post->ID ); } else { return $link; } } add_filter( 'rewrite_rules_array', 'my_rewrite_rules_array' ); function my_rewrite_rules_array( $rules ) { $new_rules = array( 'news/([0-9]+)/?$' => 'index.php?post_type=news&p=$matches[1]', ); return $new_rules + $rules; } |
最後に、ダッシュボードでパーマリンク設定をします。
リライトルールの更新も忘れずに行ってください。
これでパーマリンクのカスタマイズは完了です。
TRACKBACKS