こんにちは、Ryohei(@ityryohei)です!

本記事では、WordPress でカスタム投稿タイプのパーマリンクを投稿IDに変更する方法をご紹介しています。プラグインではなく、functions.php ファイルを使用してカスタム投稿タイプのパーマリンクをフィルターする方法を解説しています。固定ページなどでは投稿名を使用したいけれど、カスタム投稿タイプでは投稿IDに変更したいというケースで役立ちます。

WordPressでカスタム投稿タイプのパーマリンクを投稿IDに変更したいんだけど、良い方法はないかな?

上記の疑問にお答えします。

では、解説してきます。

カスタム投稿タイプのパーマリンクを変更するには

以下のフィルターフックを使用します。

  • post_type_link
  • rewrite_rules_array

post_type_link

post_type_linkは、WordPressプラグインやテーマの開発者が使用するフィルターフックの1つです。パーマリンク構造をカスタマイズする際に使用されます。

WordPressでは、投稿やページ、カスタム投稿タイプなどの各投稿タイプに対して一意のパーマリンクが生成されます。post_type_linkフィルターフックを使用すると、これらの投稿タイプごとに異なるパーマリンクの生成方法を定義することができます。

参考:https://developer.wordpress.org/reference/hooks/post_type_link/

rewrite_rules_array

rewrite_rules_arrayは、WordPress の内部的なリライトルールをカスタマイズするためのフィルターフックです。このフックを使用すると、WordPress がパーマリンクを解決する際に使用されるルールセットを変更できます。

WordPressでは、ユーザーが設定したパーマリンク構造に基づいて、URL を解析して対応するコンテンツを表示します。この処理は、リライトルールと呼ばれる一連のパターンとそれに対応する処理によって行われます。

rewrite_rules_arrayフィルターフックを使用すると、これらのリライトルールセットをカスタマイズできます。具体的には、このフックを使用して、特定のパターンのリライトルールを追加、変更、削除したり、カスタムのリライトルールを定義したりすることができます。

参考:https://developer.wordpress.org/reference/hooks/rewrite_rules_array/


post_type_link rewrite_rules_array のフィルターフックを組み合わせることで、WordPress のパーマリンク構造を柔軟にカスタマイズすることが可能となります。これらを利用することで、カスタム投稿タイプのパーマリンクを投稿IDに変更することができます。

カスタム投稿タイプのパーマリンクを投稿IDに変更する

以下は、カスタム投稿タイプのパーマリンクを投稿IDに変更するサンプルです。このコードを functions.php ファイルに追加すると動作します。サンプルでは、カスタム投稿タイプ(news)のパーマリンクを投稿IDに変更してリライトしています。実際にパーマリンクを変更するカスタム投稿タイプ名に置き換えてご利用ください。

// カスタム投稿タイプのパーマリンクの初期値を投稿IDに変更する
function my_post_type_link($post_link, $post) {
    // ニュース
    if($post->post_type === 'news') {
        return home_url('/news/'.$post->ID.'/');
    }

    return $post_link;
}
add_filter('post_type_link', 'my_post_type_link', 10, 2);

// パーマリンクのリライトルールを追加する
function my_rewrite_rules_array($rules) {
    $add_rules = array(
        'news/([0-9]+)/?$' => 'index.php?post_type=news&p=$matches[1]',
    );
    
    return $add_rules + $rules;
}
add_filter('rewrite_rules_array', 'my_rewrite_rules_array');

my_rewrite_rules_array 関数では、新しいルールを既存のルールの前に追加して値を返します。リライトルールの配列は先頭から適用されるため、追加したルールが優先されるようになっています。

上記のサンプルでは、1つのカスタム投稿タイプを指定していますが、複数のカスタム投稿タイプのパーマリンクを変更することも可能です。例えば、ニュース(news)と採用情報(recruit)のカスタム投稿タイプのパーマリンクを投稿IDに変更してみます。

// カスタム投稿タイプのパーマリンクの初期値を投稿IDに変更する
function my_post_type_link($post_link, $post) {
    // ニュース
    if($post->post_type === 'news') {
        return home_url('/news/'.$post->ID.'/');
    }
    // 採用情報
    if($post->post_type === 'recruit') {
        return home_url('/recruit/'.$post->ID.'/');
    }

    return $post_link;
}
add_filter('post_type_link', 'my_post_type_link', 10, 2);

// パーマリンクのリライトルールを追加する
function my_rewrite_rules_array($rules) {
    $add_rules = array(
        // ニュース
        'news/([0-9]+)/?$' => 'index.php?post_type=news&p=$matches[1]',
        // 採用情報
        'recruit/([0-9]+)/?$' => 'index.php?post_type=recruit&p=$matches[1]',
    );
    
    return $add_rules + $rules;
}
add_filter('rewrite_rules_array', 'my_rewrite_rules_array');

これでカスタム投稿タイプのパーマリンクを投稿IDに変更することができました。

最後に

本記事では、WordPressのpost_type_linkrewrite_rules_arrayのフィルターフックを使って、カスタム投稿タイプのパーマリンクを投稿IDに変更する方法を解説しました。

2つのフィルターフックを組み合わせることで、WordPressのパーマリンク構造を柔軟にカスタマイズし、特定のURL対する処理を定義することが可能になります。パーマリンク構造のカスタマイズはサイト規模が大きくなるほど重要になりますので、post_type_linkrewrite_rules_arrayのフィルターフックの使い方を覚えておいてくださいね。

以上、WordPressでカスタム投稿タイプのパーマリンクを投稿IDに変更する方法のご紹介でした!

この記事を書いた人

Ryohei

Webエンジニア / ブロガー

福岡のWeb制作会社に務めるWebエンジニアです。エンジニア歴は10年程で、好きな言語はPHPとJavaScriptです。本サイトは私がインプットしたWebに関する知識を整理し、共有することを目的に2015年から運営しています。Webに関するご相談があれば気軽にお問い合わせください。