この記事はおひさしぶりのWordPressまとめ - Qiitaでまとめたつまずいた点のパーマリンク関連の解決方法。
#前提
- ページャーには WP-PageNavi を使用。ページャーがおかしくならない実装を。
- デフォルトの投稿だけでなく、カスタム投稿にも反映させる。
- カスタム投稿・タクソノミーの実装は Custom Post Type UI を使用。アーカイブありにすることを忘れない。
- カスタム投稿のパーマリンクも設定でいるようにCustom Post Type Permalinksを入れる
##テンプレートファイル構造
- 投稿一覧・カテゴリー別投稿一覧
archives.php
- カスタム投稿一覧
archives-{カスタム投稿名}.php
- カスタムタクソノミー別カスタム投稿一覧
taxonomy-{カスタムタクソノミー名}.php
##ワシが目指すパーマリンク構造
-
投稿一覧
https://xxx.jp/{投稿名}/
-
投稿一覧2ページ目以降
https://xxx.jp/{投稿名}/page/{ページ番号}/
-
投稿カテゴリ一覧
https://xxx.jp/{投稿名}/{カテゴリ名}/
-
投稿カテゴリ一覧2ページ目以降
https://xxx.jp/{投稿名}/{カテゴリ名}/page/{ページ番号}/
-
投稿詳細
https://xxx.jp/{投稿名}/{カテゴリ名}/{ブログID}
#実装
##Custom Post Type UI で作成したカスタム投稿の設定
カスタム投稿の設定でデフォルトから変更したのは以下
-
Has Archive(アーカイブあり)
**「True」**に変更 -
With Front(フロントでのリライト)
**「False」**に変更
##管理画面から、記事詳細ページ
のパーマリンク設定をする。
[管理画面]>[設定]>[パーマリンク設定]
デフォルトの投稿、カスタム投稿ともに
記事詳細ページ
のパーマリンクを設定する
###共通設定
デフォルトの投稿の記事詳細のパーマリンク設定。
「カスタム構造」を選択。
/%category%/%post_id%/
と設定。
※%post_id%
は%post_name%
でも何でも良い。
これで、投稿詳細のパーマリンクは共通で、例えば/{親カテゴリ名}/{子カテゴリ名}/{ブログID}/
のようなカテゴリーをベースにしたパーマリンクになる。
###オプション<カテゴリベース・タグベース>
ここはあとでfunction.php
で設定してしまうので空欄にする。
###カスタム投稿タイプのパーマリンク設定
Custom Post Type Permalinksプラグインを入れると表示される設定項目
カスタム投稿の投稿の記事詳細のパーマリンク設定。
ここも共通設定と同じ構造にするため/%{カスタムタクソノミー名}%/%post_id%/
のように設定。
##function.php
で、カテゴリ一覧ページ
とデフォルトの投稿の記事詳細ページ
のパーマリンク設定をする
##カテゴリ一覧のパーマリンクを修正
今のままだと、
- デフォルトの投稿のカテゴリ一覧
https://xxx.jp/categoly/private/
- カスタム投稿のカテゴリ一覧
https://xxx.jp/news/newscat/media/
となっているので、
/categoly/
は/blog/
に変更、/newscat/
は削除。
そして
① WordPressのタグで出力するリンクの変更
② リライトルールの変更
をする必要がある。
// カテゴリ一覧のパーマリンク設定
// ①WordPressのタグで出力するリンクの変更
// $taxonomyがnewscatだったら「str_replace()」で「/newscat/」を削除
// それ以外(デフォルトの投稿)は「/blog/」に変更
function my_custom_post_type_permalinks_set( $termlink, $term, $taxonomy ) {
return ( 'newscat' === $taxonomy ? str_replace( '/' . $taxonomy . '/', '/', $termlink ) : str_replace( '/' . $taxonomy . '/', '/blog/', $termlink ) );
}
add_filter( 'term_link', 'my_custom_post_type_permalinks_set', 11, 3 );
// ②リライトルールの変更
add_rewrite_rule( 'blog/([^/]+)/?$', 'index.php?category_name=$matches[1]', 'top' );
add_rewrite_rule( 'blog/([^/]+)/page/([0-9]+)/?$', 'index.php?category_name=$matches[1]&paged=$matches[2]', 'top' );
add_rewrite_rule( 'news/([^/]+)/?$', 'index.php?newscat=$matches[1]', 'top' );
add_rewrite_rule( 'news/([^/]+)/page/([0-9]+)/?$', 'index.php?newscat=$matches[1]&paged=$matches[2]', 'top' );
※function.php
設定し保存したら、管理画面からパーマリンク設定
で何も変更せずに変更を保存
すること!
###デフォルトの投稿の記事詳細に/blog/
(アーカイブ名)を追加する
今のままだと、
- デフォルトの投稿の記事詳細
https://xxx.jp/{カテゴリ名}/{ブログID}
パーマリンクがカテゴリ名から始まってしまう。
ちなみに親カテゴリにblog
を常に設定するとかならこの設定はいらないわね
カテゴリ名の前に、/blog/
を出力させる
// デフォルトの投稿の記事詳細に`/blog/`(アーカイブ名)を追加する
function add_article_post_permalink( $permalink ) {
$permalink = '/blog' . $permalink;
return $permalink;
}
add_filter( 'pre_post_link', 'add_article_post_permalink' );
※function.php
設定し保存したら、管理画面からパーマリンク設定
で何も変更せずに変更を保存
すること!
#以上の設定で美しいパーマリンクにできるんじゃ
-
投稿一覧
https://xxx.jp/{投稿名}/
-
投稿一覧2ページ目以降
https://xxx.jp/{投稿名}/page/{ページ番号}/
-
投稿カテゴリ一覧
https://xxx.jp/{投稿名}/{カテゴリ名}/
-
投稿カテゴリ一覧2ページ目以降
https://xxx.jp/{投稿名}/{カテゴリ名}/page/{ページ番号}/
-
投稿詳細
https://xxx.jp/{投稿名}/{カテゴリ名}/{ブログID}
これでこんな理想のパーマリンクに設定できる。
みんな幸せになれる。
#参考
【SEOを考慮したWordPressサイト構築】3/3 STEP3 カスタム投稿タイプURLの設定方法|テクニカルブログ|株式会社エムハンド