結論から解決したい問題提議とその解決方法をまとめると、まず通常WordPressのカスタム投稿のパーマリンクは、投稿に反映されるパーマリンク構成をそのまま適用させたくないケースが多い。ではあるが、rewriteオプションの設定がカスタム投稿のパーマリンクに反映されるため、この中でパーマリンク構造の前方スラッグを無視するか否かを判定する’with_front’がtrueになっていると、投稿ページのパーマリンク設定で指定した前方スラッグ(たとえば blog/)が、カスタム投稿タイプのURLにも適用されることになる。そのため、問題の原因はこの’with_front’にはfalseを設定しなければならないが、デフォルトのテーマの設定ではtrueもしくは’with_front’自体が定義されていないため、デフォルト値としてtrueとなってしまい、求めているカスタム投稿のパーマリンクの前方に不要なスラッグが含まれてしまう現象が起こる。そのため、解決策として、’with_front’をfalseに書き換える処理が必要になり、これをカスタムプラグインで実現するというのが当記事で解説したい内容となる。なお、私はWordPressの専門家ではないためあくまでこれまでの知見や調べた範囲内での解決手段であることを断っておく。
そもそもカスタム投稿タイプとは?
カスタム投稿タイプ(Custom Post Types)は、WordPressでデフォルトの投稿や固定ページとは異なる種類のコンテンツを作成・管理するための機能。簡単に言うと、独自の目的に特化した投稿ページ群を作成することができ、通常のブログ記事の「投稿」や「固定ページ」とは異なる構造や分類方法を持つコンテンツを管理することが可能になる。
通常の投稿タイプ(例: 投稿)では、コンテンツをカテゴリやタグを使って分類・整理することができるが、カスタム投稿タイプでは、これらとは異なる独自のグルーピングや分類を定義する。例えば、製品情報、イベントリスト、ポートフォリオ、FAQ(よくある質問)など、特定の用途に最適化されたページ群を作成でき、これによって、より柔軟で用途に応じたコンテンツ管理を行うことができる。当記事ではカスタム投稿タイプについての解説記事ではないため解説については以上とする。
求めているカスタム投稿タイプのパーマリンク構成
- 通常ページ投稿:/blog/%category%/%post_id%/
- カスタム投稿タイプ:/products/%post_name%/
カスタム投稿タイプのパーマリンクの変更は『Custom Post Type Permalinks』
カスタム投稿タイプのパーマリンクの設定は『Custom Post Type Permalinks』のプラグインから行うと設定しやすい。ここではこのプラグインの使い方については割愛するが、このプラグインの設定の中でwith_front : false となっていれば、前方スラッグが適用されない設定となっていることを意味し、trueであれば前方スラッグが適用されるので、今どのような設定になっているのかを確認することができる。以下、添付画像ではすでに当記事で解説した内容で修正済みなのでfalseとなっている。
カスタム投稿のパーマリンクから前方スラッグを排除したい
さて問題となるのは、カスタム投稿ページを作成し、いざページを開いてみると404エラーが表示され画面が真っ白となる件である。ここではこの問題がカスタム投稿のパーマリンクの前方に不要なスラッグが入ってしまっているからに対しての解決策を提示することとする。
なぜ前方に不要なスラッグが入るのか?
WordPressでは、rewriteオプションを使用するときにwith_frontオプションがデフォルトでtrueに設定されている。仮にパーマリンク設定が[ /blog/%category%/%postname%/ ]のように[ blog/ ]という前方スラッグが設定されており、with_frontがtrueで設定されている、もしくはwith_frontが設定されていない場合、パーマリンク設定で指定した前方スラッグ(たとえば blog/)が、カスタム投稿タイプのURLにも適用されてしまう。
であればwith_frontをfalseに設定すれば解決する
'with_front' => true
↓
'with_front' => false
カスタムプラグインで対応
with_frontが記載されているregister_post_type関数を直接修正してもよいが、あまりWordPressのコアファイルを直接いじりたくないため、カスタムプラグインという形で修正を加える。カスタムプラグインを使うことでWordPressのプラグインと同じように、WordPressのテーマファイルとは切り離して独自の機能やカスタマイズを追加することが可能になる。
カスタムプラグインを作成する手順
- プラグインフォルダを作成
WordPressのwp-content/pluginsディレクトリ内に、新しいプラグイン用のフォルダを作成 - プラグインファイルを作成
新しいフォルダ内に、.php拡張子のファイルを作成し、そこにプラグインのヘッダー情報(プラグイン名、説明、バージョンなど)を記述 - 必要な機能を追加
このファイルに必要な機能をPHPコードとして追加します。例えば、特定の機能をフックやフィルタでWordPressに統合
サンプル例
このプラグインを有効化すると、WordPressのフッターに「This is my custom plugin!」というメッセージが表示される。
<?php
/*
Plugin Name: My Custom Plugin
Description: This is a simple custom plugin example.
Version: 1.0
Author: Your Name
*/
// プラグインに追加する機能のコード
function my_custom_function() {
echo "This is my custom plugin!";
}
add_action('wp_footer', 'my_custom_function');
?>
カスタム投稿タイプのパーマリンクから前方スラッグを除去するコード
このコードで、WordPressのカスタムプラグインとして機能し、指定したカスタム投稿タイプのパーマリンク(URL)から、サイト全体のパーマリンク設定で指定されている前方スラッグ(例:blog/
)を除外する。
<?php
/*
Plugin Name: Custom Rewrite Plugin
Description: カスタム投稿タイプのパーマリンクから前方スラッグを無視します。
Version: 1.0
Author: あなたの名前
*/
// カスタム投稿タイプのパーマリンクから前方スラッグを無視する
function modify_custom_post_type_rewrite($args, $post_type) {
// ここで対象とするカスタム投稿タイプを指定します
$post_types = array('news', 'case_study', 'service', 'faq', 'chart'); // カスタム投稿タイプを複数指定できます
if (in_array($post_type, $post_types)) {
// カスタム投稿タイプのrewrite設定を変更
$args['rewrite']['with_front'] = false;
}
return $args;
}
add_filter('register_post_type_args', 'modify_custom_post_type_rewrite', 10, 2);
1.プラグインのヘッダー情報
<?php
/*
Plugin Name: Custom Rewrite Plugin
Description: カスタム投稿タイプのパーマリンクから前方スラッグを無視します。
Version: 1.0
Author: あなたの名前
*/
<?php
:PHPのコードが始まることを示します。- プラグインヘッダー:
Plugin Name
:プラグインの名前。WordPressの管理画面で表示されます。Description
:プラグインの説明。プラグインの機能を簡潔に示します。Version
:プラグインのバージョン番号。Author
:プラグインの作者名。
この部分は、WordPressがこのファイルをプラグインとして認識するために必要な情報です。
2.関数の定義開始
// カスタム投稿タイプのパーマリンクから前方スラッグを無視する
function modify_custom_post_type_rewrite($args, $post_type) {
function modify_custom_post_type_rewrite($args, $post_type)
:$args
:カスタム投稿タイプの登録時の引数(設定)を表す配列。$post_type
:現在処理しているカスタム投稿タイプの名前(文字列)。
- 目的:
register_post_type_args
フィルターを介して、カスタム投稿タイプのパラメータを変更します。
3.対象のカスタム投稿タイプを指定
// ここで対象とするカスタム投稿タイプを指定します
$post_types = array('news', 'case_study', 'service', 'faq', 'chart'); // カスタム投稿タイプを複数指定できます
$post_types
:前方スラッグを無視したいカスタム投稿タイプを配列で指定します。'news'
、'case_study'
、'service'
、'faq'
、'chart'
が指定されています。
- ポイント:この配列に追加・削除することで、対象のカスタム投稿タイプを簡単に変更できます。
4.条件分岐による処理
if (in_array($post_type, $post_types)) {
// カスタム投稿タイプのrewrite設定を変更
$args['rewrite']['with_front'] = false;
}
if (in_array($post_type, $post_types))
:in_array
関数を使って、現在の$post_type
が$post_types
配列内に存在するかチェックします。- 目的:対象のカスタム投稿タイプである場合のみ、以下の処理を実行します。
$args['rewrite']['with_front'] = false;
:$args
配列の中の'rewrite'
キーの'with_front'
オプションをfalse
に設定します。with_front
オプション:true
(デフォルト):パーマリンクの前方スラッグを含める。false
:パーマリンクの前方スラッグを含めない。
- 効果:カスタム投稿タイプのURLから、前方スラッグ(例:
blog/
)を除外します。
5.関数の終了と引数の返却
return $args;
}
return $args;
:変更した$args
配列を返します。これにより、カスタム投稿タイプの登録時に新しい設定が適用されます。}
:関数の終了を示します。
6.フィルターの追加
add_filter('register_post_type_args', 'modify_custom_post_type_rewrite', 10, 2);
add_filter
:WordPressのフィルター機能を使用して、特定のタイミングで関数を実行します。'register_post_type_args'
:カスタム投稿タイプが登録される際に呼び出されるフィルターフックです。'modify_custom_post_type_rewrite'
:先ほど定義した関数を指定します。10
:フィルターの優先度(デフォルト値)。2
:フィルターに渡される引数の数($args
と$post_type
の2つ)。
コードの動作まとめ
-
カスタム投稿タイプの登録時に、
register_post_type_args
フィルターを介して、各カスタム投稿タイプの設定($args
)がmodify_custom_post_type_rewrite
関数に渡されます。 -
関数内で、現在のカスタム投稿タイプ(
$post_type
)が指定した対象($post_types
配列内)に含まれているかチェックします。 -
対象である場合、
$args['rewrite']['with_front']
をfalse
に設定し、前方スラッグをパーマリンクから除外します。 -
変更された
$args
を返し、カスタム投稿タイプの登録に反映させます。
実際の影響と例
- パーマリンク設定:
/blog/%postname%/
の場合、通常の投稿はhttps://example.com/blog/記事名/
のようになります。 - カスタム投稿タイプ
'news'
の場合:
・このプラグインによって、前方スラッグblog/
が除外されます。
・結果:https://example.com/news/記事名/
となります。 -
with_front
を設定しない場合(デフォルトのまま):
・カスタム投稿タイプのURLも前方スラッグを含みます。
・結果:https://example.com/blog/news/記事名/
となります。
カスタマイズの方法
- 対象のカスタム投稿タイプを変更する:
・$post_types
配列に、前方スラッグを除外したいカスタム投稿タイプのスラッグを追加または削除します。
・例:$post_types = array('portfolio', 'testimonials');
- フィルターの優先度を変更する:
・add_filter
の第三引数(10
)を変更することで、フィルターの実行順序を調整できます。
・数字が小さいほど優先度が高く、早く実行されます。
関数の引数と呼び出しについて詳細解説
$args
と $post_type
には、それぞれ register_post_type
関数が呼び出されたときに渡されるデータが入ります。これらの引数は、WordPressのフックシステム(フィルター)を使って register_post_type_args
フィルターを通じて関数に渡されます。
詳しく説明すると、register_post_type
を使ってカスタム投稿タイプを登録するとき、WordPressはそのカスタム投稿タイプに関するさまざまな設定を行います。その際に、register_post_type_args
というフィルターフックを使って、投稿タイプの引数を変更したり調整することができます。
register_post_type
が呼び出される
WordPressがregister_post_type
を使って、カスタム投稿タイプを登録する際に、投稿タイプのパラメータが内部的に設定されます。このとき、カスタム投稿タイプのすべてのパラメータを含む配列が$args
として生成されます。register_post_type_args
フィルターが実行される
WordPressは、この投稿タイプのパラメータ($args
)をregister_post_type_args
フィルターを使って変更できるようにします。このフィルターは、カスタム投稿タイプが登録される際に、その設定に対して最後の調整を行う機能です。modify_custom_post_type_rewrite
関数に引数が渡される
$args:register_post_type に渡された投稿タイプの設定情報が含まれる配列です。この配列には、public や rewrite など、カスタム投稿タイプを設定するためのキーと値が含まれています。
$post_type:現在登録しようとしているカスタム投稿タイプの名前(スラッグ)が文字列で渡されます。たとえば、カスタム投稿タイプが news なら、この値は ‘news’ です。
引数の内容
1.$args
(カスタム投稿タイプの設定情報)$args
には、カスタム投稿タイプの詳細な設定情報が入っています。主な内容は以下のようなものです。
$args = array(
'label' => 'News', // 投稿タイプの表示名
'public' => true, // 一般公開されるかどうか
'rewrite' => array(
'slug' => 'news', // パーマリンクに使うスラッグ
'with_front' => true // 前方スラッグ(例: blog/)を使うかどうか
),
// その他の設定
);
この $args
の内容を register_post_type_args
フィルターを使ってカスタマイズすることができます。modify_custom_post_type_rewrite
関数では、特に rewrite
配列の with_front
設定を変更しています。
2.$post_type
(カスタム投稿タイプの名前)$post_type
は、カスタム投稿タイプのスラッグ(名前)が渡されます。たとえば、以下のようにカスタム投稿タイプを定義した場合:
register_post_type('news', array(
'label' => 'News',
'public' => true,
'rewrite' => array('slug' => 'news'),
));
この場合、$post_type
には 'news'
という値が渡されます。
コードがどのように動作しているか
- WordPressがカスタム投稿タイプ(例:
news
)を登録する際に、register_post_type
が呼び出されます。
・その時点で、投稿タイプの設定が$args
配列に格納されます(たとえばrewrite
設定など)。
・この投稿タイプの名前(例:news
)が$post_type
にセットされます register_post_type_args
フィルターが実行され、modify_custom_post_type_rewrite
関数が呼び出されます。
・modify_custom_post_type_rewrite
関数に、$args
(投稿タイプの設定)と$post_type
(投稿タイプの名前)が引数として渡されます。modify_custom_post_type_rewrite
関数が$args
のrewrite['with_front']
をfalse
に設定します。
・これにより、$post_type
がnews
など、指定されたカスタム投稿タイプの場合に、前方スラッグをパーマリンクに含めないように設定が変更されます。return $args;
で変更された$args
を返し、WordPressがその情報を使ってカスタム投稿タイプを登録します。
まとめ
$args
には、カスタム投稿タイプのすべての設定情報(配列)が入っています。これには、public
、rewrite
などの情報が含まれます。$post_type
には、現在登録されようとしているカスタム投稿タイプの名前(スラッグ)が渡されます(例:news
)。modify_custom_post_type_rewrite
関数では、特定のカスタム投稿タイプに対して、with_front
オプションをfalse
に変更して、パーマリンクから前方スラッグを除外しています。
WordPressがカスタム投稿タイプを登録するとき、これらの引数をフィルターを通じて関数に渡し、そのカスタム投稿タイプの設定を変更するために利用しています。