ブログ一覧に戻る
Wordpress

WordPressのパーマリンクをコードでカスタマイズする方法

5 min read
M

Masaki Oba

代表取締役・WordPress運用スペシャリスト

目次

WordPressのパーマリンクをコードでカスタマイズする方法

パーマリンクの基本

パーマリンクとは、各ページに割り当てられる固定URLのことです。WordPressでは管理画面の「設定 > パーマリンク」からURL構造を選択できます。

よく使われる設定は「投稿名」(/%postname%/)ですが、案件によっては「投稿のURLに /news/ を挟みたい」「カスタム投稿タイプのスラッグを変えたい」など、管理画面だけでは対応できないケースがあります。

そういった場面では、フィルターフックを使ってコードでカスタマイズします。

投稿のURLにプレフィックスを追加する

たとえば、投稿の詳細ページURLを example.com/sample-post/ から example.com/news/sample-post/ のように変更したいケースです。

これには2つのフィルターを組み合わせます。

パーマリンクの出力を変更する

post_link フィルターを使って、投稿のURLに /news/ を挿入します。

function custom_post_permalink( $permalink ) {
    $home_url = home_url( '/' );
    $permalink = str_replace( $home_url, $home_url . 'news/', $permalink );
    return $permalink;
}
add_filter( 'post_link', 'custom_post_permalink' );

元の記事ではトップレベルドメイン(.jp/)を基準にした str_replace を使っていましたが、home_url() を使ったほうが環境に依存しません。

リライトルールを追加する

URLの表示を変えただけでは、実際にそのURLでアクセスしたときに404になります。WordPressに「/news/ 付きのURLでも投稿を表示してね」と教えるために、リライトルールを書き換えます。

function custom_post_rewrite_rules( $post_rewrite ) {
    $rewrite_rules = [];
    foreach ( $post_rewrite as $regex => $rewrite ) {
        $rewrite_rules[ 'news/' . $regex ] = $rewrite;
    }
    return $rewrite_rules;
}
add_filter( 'post_rewrite_rules', 'custom_post_rewrite_rules' );

これで /news/記事スラッグ/ のURLで正しく投稿が表示されるようになります。

カスタム投稿タイプのスラッグを変更する

カスタム投稿タイプを register_post_type で登録するとき、rewrite パラメータでスラッグを指定できます。

register_post_type( 'works', [
    'label'  => '実績',
    'public' => true,
    'rewrite' => [
        'slug'       => 'works',
        'with_front' => false,
    ],
    // ...
]);

with_frontfalse にすると、パーマリンク設定で指定したプレフィックス(例: /blog/)がカスタム投稿タイプのURLに付かなくなります。

with_front結果
true(デフォルト)/blog/works/記事スラッグ/
false/works/記事スラッグ/

カスタムタクソノミーのスラッグを変更する

カスタムタクソノミーも同様に、rewrite パラメータでスラッグを制御できます。

register_taxonomy( 'works_category', 'works', [
    'label'  => '実績カテゴリー',
    'public' => true,
    'rewrite' => [
        'slug'         => 'works/category',
        'with_front'   => false,
        'hierarchical' => true,
    ],
]);

hierarchicaltrue にすると、親子関係のあるタームのURLに階層が反映されます(例: /works/category/親/子/)。

リライトルールのフラッシュを忘れずに

パーマリンクに関するコードを追加・変更したあとは、リライトルールのフラッシュが必要です。これを忘れるとURLが正しく動作しません。

一番手軽な方法は、管理画面の「設定 > パーマリンク」を開いて、何も変えずに「変更を保存」をクリックすることです。

コードで行う場合は flush_rewrite_rules() を使いますが、この関数はコストが高いため、init などで毎回実行するのは避けてください。テーマやプラグインの有効化時に一度だけ実行するのが適切です。

function my_theme_activate() {
    // カスタム投稿タイプやタクソノミーの登録処理
    custom_post_types();
    flush_rewrite_rules();
}
add_action( 'after_switch_theme', 'my_theme_activate' );

よくあるトラブル

URLを変更したのに404になる

リライトルールがフラッシュされていない可能性が高いです。管理画面のパーマリンク設定を保存し直してみてください。

パーマリンクの変更が反映されない

キャッシュプラグインを使っている場合は、キャッシュのクリアも必要です。また、.htaccess のパーミッションが書き込み不可になっていると、リライトルールが保存できないことがあります。

本番環境で突然404になった

サーバー移行やドメイン変更のあとに起きやすいトラブルです。.htaccess が正しく生成されているか確認し、パーマリンク設定を保存し直してください。

WordPress運用で
お困りではありませんか?

セキュリティ対策、パフォーマンス改善、緊急時の対応まで。 WordPress専門15年超のエンジニアが直接サポートします。

WordPress専門15年超 エンジニアが直接対応 月額20万円〜 最低契約6ヶ月