[WordPress]投稿のパーマリンクを美しく[パーマリンク設定]

この記事は[おひさしぶりのWordPressまとめ \- Qiita](https://qiita.com/super-mana-chan/items/2d2a3ccd81008f054928)でまとめたつまずいた点のパーマリンク関連の解決方法。

#前提

* ページャーには [WP\-PageNavi](https://ja.wordpress.org/plugins/wp-pagenavi/) を使用。ページャーがおかしくならない実装を。
* デフォルトの投稿だけでなく、カスタム投稿にも反映させる。
* カスタム投稿・タクソノミーの実装は [Custom Post Type UI](https://ja.wordpress.org/plugins/custom-post-type-ui/) を使用。アーカイブありにすることを忘れない。
* カスタム投稿のパーマリンクも設定でいるように[Custom Post Type Permalinks](https://ja.wordpress.org/plugins/custom-post-type-permalinks/)を入れる

##テンプレートファイル構造

* 投稿一覧・カテゴリー別投稿一覧
    * `archives.php`
* カスタム投稿一覧
    * `archives-{カスタム投稿名}.php`
* カスタムタクソノミー別カスタム投稿一覧
    * `taxonomy-{カスタムタクソノミー名}.php`

##ワシが目指すパーマリンク構造

* **投稿一覧**
    * `https://xxx.jp/{投稿名}/`
* **投稿一覧２ページ目以降**
    * `https://xxx.jp/{投稿名}/page/{ページ番号}/`
* **投稿カテゴリ一覧**
    * `https://xxx.jp/{投稿名}/{カテゴリ名}/`
* **投稿カテゴリ一覧２ページ目以降**
    * `https://xxx.jp/{投稿名}/{カテゴリ名}/page/{ページ番号}/`
* **投稿詳細**
    * `https://xxx.jp/{投稿名}/{カテゴリ名}/{ブログID}`

#実装

##[Custom Post Type UI](https://ja.wordpress.org/plugins/custom-post-type-ui/) で作成したカスタム投稿の設定

**カスタム投稿の設定でデフォルトから変更したのは以下**

* `Has Archive（アーカイブあり）`　**「True」**に変更
* `With Front（フロントでのリライト）`　**「False」**に変更

##管理画面から、`記事詳細ページ` のパーマリンク設定をする。
**[管理画面]>[設定]>[パーマリンク設定]**
デフォルトの投稿、カスタム投稿ともに
`記事詳細ページ`のパーマリンクを設定する

###共通設定

デフォルトの投稿の記事詳細のパーマリンク設定。

「カスタム構造」を選択。
`/%category%/%post_id%/`と設定。
※`%post_id%`は`%post_name%`でも何でも良い。
<img width="798" alt="スクリーンショット 2020-03-03 14.13.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304162/314cb521-254d-3a10-9aa7-8bdc019c7358.png">
これで、投稿詳細のパーマリンクは共通で、例えば`/{親カテゴリ名}/{子カテゴリ名}/{ブログID}/`のようなカテゴリーをベースにしたパーマリンクになる。

###オプション<カテゴリベース・タグベース>
**ここはあとで`function.php`で設定してしまうので空欄にする。**

###カスタム投稿タイプのパーマリンク設定
[Custom Post Type Permalinks](https://ja.wordpress.org/plugins/custom-post-type-permalinks/)プラグインを入れると表示される設定項目

カスタム投稿の投稿の記事詳細のパーマリンク設定。

ここも共通設定と同じ構造にするため`/%{カスタムタクソノミー名}%/%post_id%/`のように設定。

<img width="835" alt="スクリーンショット 2020-03-03 17.04.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304162/f93e339b-cfd0-8cbc-9562-aac7e41e91f8.png">

##`function.php`で、`カテゴリ一覧ページ` と`デフォルトの投稿の記事詳細ページ` のパーマリンク設定をする

##カテゴリ一覧のパーマリンクを修正
今のままだと、

* デフォルトの投稿のカテゴリ一覧　`https://xxx.jp/categoly/private/`
* カスタム投稿のカテゴリ一覧　`https://xxx.jp/news/newscat/media/`

となっているので、
**`/categoly/`は`/blog/`に変更、`/newscat/`は削除。**

そして
**① WordPressのタグで出力するリンクの変更**
**② リライトルールの変更**
をする必要がある。

```php:function.php
// カテゴリ一覧のパーマリンク設定

// ①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`を常に設定するとかならこの設定はいらないわね:robot:

カテゴリ名の前に、`/blog/`を出力させる

```php:function.php
// デフォルトの投稿の記事詳細に`/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/{投稿名}/`
* **投稿一覧２ページ目以降**
    * `https://xxx.jp/{投稿名}/page/{ページ番号}/`
* **投稿カテゴリ一覧**
    * `https://xxx.jp/{投稿名}/{カテゴリ名}/`
* **投稿カテゴリ一覧２ページ目以降**
    * `https://xxx.jp/{投稿名}/{カテゴリ名}/page/{ページ番号}/`
* **投稿詳細**
    * `https://xxx.jp/{投稿名}/{カテゴリ名}/{ブログID}`

これでこんな理想のパーマリンクに設定できる。
みんな幸せになれる。

#参考
[【SEOを考慮したWordPressサイト構築】3/3 STEP3 カスタム投稿タイプURLの設定方法｜テクニカルブログ｜株式会社エムハンド](https://www.m-hand.co.jp/program/2658/)