Help us understand the problem. What is going on with this article?

[WordPress]~ワシャ投稿のパーマリンクを美しくしたいだけなんじゃ~[パーマリンク設定]

この記事はおひさしぶりの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%でも何でも良い。
スクリーンショット 2020-03-03 14.13.54.png
これで、投稿詳細のパーマリンクは共通で、例えば/{親カテゴリ名}/{子カテゴリ名}/{ブログID}/のようなカテゴリーをベースにしたパーマリンクになる。

オプション<カテゴリベース・タグベース>

ここはあとでfunction.phpで設定してしまうので空欄にする。

カスタム投稿タイプのパーマリンク設定

Custom Post Type Permalinksプラグインを入れると表示される設定項目

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

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

スクリーンショット 2020-03-03 17.04.05.png

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

カテゴリ一覧のパーマリンクを修正

今のままだと、

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

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

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

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/を出力させる

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/{投稿名}/
  • 投稿一覧2ページ目以降
    • https://xxx.jp/{投稿名}/page/{ページ番号}/
  • 投稿カテゴリ一覧
    • https://xxx.jp/{投稿名}/{カテゴリ名}/
  • 投稿カテゴリ一覧2ページ目以降
    • https://xxx.jp/{投稿名}/{カテゴリ名}/page/{ページ番号}/
  • 投稿詳細
    • https://xxx.jp/{投稿名}/{カテゴリ名}/{ブログID}

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

参考

【SEOを考慮したWordPressサイト構築】3/3 STEP3 カスタム投稿タイプURLの設定方法|テクニカルブログ|株式会社エムハンド

super-mana-chan
heightは「ヘイト」じゃなくて「ハイト」
sorich
SORICHはWebシステム開発を主軸に、デザイン・Web制作・アプリ開発・IoTまで、クライアントの幅広いニーズに対応する技術者集団です。
https://www.sorich.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away