投稿の個別ページのみパーマリンクを変更する方法

WordPress で投稿のURLは、 /article/%postname%/ とか /blog/%post_id%/ にしたいけど、パーマリンク設定で article や blog といったディレクトリを入れてしまうと、カテゴリーやアーカイブの表示でも、このディレクトリが付いてしまってかっこ悪いですよね。

今回は、このちょっとしたモヤモヤを解消するべく、投稿の詳細表示の時のみ特定のディレクトリを追加する方法を紹介します。

投稿詳細ページのパーマリンクを変えるには、リンクを出力する時と、アクセスされた際に条件を判定するリライトルールの作成時の二箇所にフックをする必要があります。

この記事は、jim912によって書かれたものです。
引用を行う場合は、著作権法に定める範囲にて、引用元であるSimple Colorsの出展元表示とhttp://www.warna.info/archives/2721/へのリンクを必ず行って下さい。

前者は、pre_post_link と言うフィルターフックを利用します。このフィルターフックは、get_permalink 関数内に存在し、パーマリンク設定の内容をフィルタリングすることができます。ここで、ディレクトリ名を追加することで、投稿のパーマリンクにディレクトリが追加されます。

ただし、これだけだと変更したパーマリンクを WordPress が解釈できずに404になってしまいます。
これは、リライトルールに変更されたパーマリンクの構造が反映されないためで、このリライトルールにもディレクトリを追加したものを反映させる必要があります。
リライトルールにも、ディレクトリを追加するには、post_rewrite_rules と言うフィルターフックを利用します。
リライトルールは、生成される際に、投稿、固定ページ、カテゴリー毎に作られ最終的にマージされますが、post_rewrite_rules はこのうち投稿詳細に関するルールのみをフィルタリングできるフィルターフックで、ここで得られる配列をフィルタリングし、ディレクトリ名を追加していきます。

function add_article_post_permalink( $permalink ) {
	$permalink = '/article' . $permalink;
	return $permalink;
}
add_filter( 'pre_post_link', 'add_article_post_permalink' );

function add_article_post_rewrite_rules( $post_rewrite ) {
	$return_rule = array();
	foreach ( $post_rewrite as $regex => $rewrite ) {
		$return_rule['article/' . $regex] = $rewrite;
	}
	return $return_rule;
}
add_filter( 'post_rewrite_rules', 'add_article_post_rewrite_rules' );

※ 適用したらパーマリンク設定のページにアクセスし、リライトルールを更新しておく必要があります。

カテゴリー: WordPressの小技 タグ: , , , パーマリンク

投稿の個別ページのみパーマリンクを変更する方法 への2件のフィードバック

  1. 中川 のコメント:

    管理人様

    はじめまして、コメント失礼いたします。
    WordPressのfunctions.phpを使ったパーマリンクの書き換え方法について調べていて、
    こちらのページを見つけました。

    こちらのサイト自体は以前から何度も拝見させていただいているのですが、
    管理人の大曲様はWordPressの専門家でいらっしゃるようなので、
    不躾で大変申し訳ありませんが、少しばかり質問させてください。

    当方、WordPressで投稿ページより画像ファイルなどをアップロードした際に
    自動で生成される添付ファイルページ(attachment)のパーマリンクについて、
    こちらの記事の解説にあるように任意のディレクトリを追加したいと考えています。

    具体的には、投稿ページのパーマリンクが以下のような形式だといたします。

    ttp://domein.com/archives/post/

    すると、デフォルトでは添付ファイルページのパーマリンクは以下のような構造になるかと思います。

    ttp://domein.com/archives/post/filename/
    または
    ttp://domein.com/archives/post/attachment/filename/

    これに、以下のように添付ファイルのスラッグ直前に任意のディレクトリを追加したいと考えています。

    ttp://domein.com/archives/post/media/filename/
    または
    ttp://domein.com/archives/post/media/attachment/filename/

    このような添付ファイルページにおけるパーマリンク書き換え方法について、こちらの記事を参考にソースを追って理解しようと努めてみましたが、何分初心者なものですから、今の当方の力量ではクリアするのは難しいと判断し、お知恵をお貸しいただけないかと思い今回コメントさせていただきました。

    当方が実践したいのは、こちらの記事で解説されている、投稿の個別ページのURLのみに任意のディレクトリを追加するのと同様に、添付ファイルページのURLのみに対し上記のような任意のディレクトリを追加する方法です。

    突然にこのような一方的な質問を差し上げて大変申し訳ないと思っておりますが、お恥ずかしながらこの件で数日ほど悩んでいまして、どうしても自分の力では解決できないので、今回プロの方のお力を貸しいただきたく直接コメント欄に書き込みさせていただきました。

    また専門的なことですから、具体的なfunctions.phpに記述するコードを無料で教えて欲しいというのも申し訳ないので、有償にてご相談させていただけないかと考えております(予算につきましては数万円程度を目安に相談させていただければ幸いです)。

    もしご迷惑でなければ、記載させていただいたメールアドレスにお返事いただけないでしょうか。

    お忙しいところ申し訳ございませんが、
    何卒よろしくお願いいたします。

    中川

  2. ピンバック: 2014年2月に参考になった記事 | ホームページ/インターネット関連 | 株式会社ベクトル Staff Blog

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です