WordPressでカスタム投稿タイプのパーマリンクを数字ベースに変更する方法をご紹介いたします。
カスタム投稿タイプのデフォルトのパーマリンク設定は”投稿名”になっています。パーマリンク設定を投稿名以外にしたい場合、プラグインを使っても良いですが、functions.phpに少し追記するだけで簡単に変更可能です。
カスタム投稿タイプの追加
まずは、カスタム投稿タイプを追加します。今回は「book」というカスタム投稿タイプを追加しました。
※カスタム投稿タイプの追加方法については、「プラグインを使わずにカスタム投稿やカスタムタクソノミーを追加する方法」をご参照ください。
function add_custom_post_type() {
$args = array(
'label' => 'ブック',
'hierarchical' => false,
'public' => true,
'menu_position' => 5,
'has_archive' => true,
'show_in_rest' => true,
'rewrite' => array('with_front' => false),
'supports' => array(
'title',
'editor',
'thumbnail'
)
);
register_post_type( 'book', $args );
}
add_action( 'init', 'add_custom_post_type' );
ハイライトしていますが、上記の中で「’rewrite’ => array(‘with_front’ => false)」は必須です。これを入れておかないと、後述するコードが正常に機能しない可能性があります。
なお、with_frontをfalseにするとデフォルトのパーマリンクに設定されているarchivesなどの文字列が除外されます。with_frontについては、フラップイズムさんの記事がわかりやすかったです。一部抜粋いたします。
例えば、「設定」→「パーマリンク設定」にてカスタム構造を選択し、「/blog/%post_id%/」と設定した場合、全ての記事に「/blog」というURLがつくことになるわけですが、その値を格納しているのがWP_Rewriteの$frontです。
フラップイズム
つまり、これが「true」になっていて、カスタム構造を選択し、「/blog/%post_id%/」と設定すると、「add_permastruct」にて「/%blog%/%post_id%/」と設定していても、「/blog/%blog%/%post_id%/」と解釈されてしまいます。
混乱が起きるのを防ぐためにも、「false」に設定することをお勧めします。
カスタム投稿タイプのパーマリンクを数字ベース(投稿ID)に変更する方法
「book」というカスタム投稿タイプを追加している場合、以下のコードをfunctions.phpに追加します。
function book_post_type_link( $link, $post ){
if ( $post->post_type === 'book' ) {
return home_url( '/book/' . $post->ID );
} else {
return $link;
}
}
add_filter( 'post_type_link', 'book_post_type_link', 1, 2 );
function book_rewrite_rules_array( $rules ) {
$new_rewrite_rules = array(
'book/([0-9]+)/?$' => 'index.php?post_type=book&p=$matches[1]',
);
return $new_rewrite_rules + $rules;
}
add_filter( 'rewrite_rules_array', 'book_rewrite_rules_array' );
「book」となっているところを適宜変更してください。
上記コードをfunctions.phpに追加することで、カスタム投稿タイプのパーマリンクが数字ベースに変更されます。投稿IDが128の場合は、「https://example.com/book/128」がカスタム投稿のURLになります。
あとがき
パーマリンクが数字ベースだとURLがスッキリしますね。
functions.phpは触りたくないなーという場合は、「Custom Post Type Permalinks」や「Simple Post Type Permalinks」等のプラグインが便利です。