カスタム投稿のURLを /works/web/sample/ のようにしたい場合は、投稿タイプのリライトルールと記事リンクを生成する処理を両方設定します。リンクの文字列だけを書き換えても、そのURLをWordPressが解釈できなければ404になります。
この記事では投稿タイプを work、タクソノミーを work_category とした新規構築の例を紹介します。既存サイトのURLを変更する場合は、旧URLからの転送設計も必要です。
先にURLと分類の運用を決める
- 制作実績一覧:
/works/ - 分類一覧:
/work-category/web/ - 記事詳細:
/works/web/sample/
記事詳細のURLには選択したタームのスラッグを1つ使います。分類が階層型でも親・子を並べたURLにはしません。複数選択した場合はタームIDが最も小さいものを採用するため、基本は1記事につき1タームの運用にします。
投稿タイプとリンク生成を設定する
次のコードを jbw-work-permalinks.php として保存し、wp-content/plugins/jbw-work-permalinks/ に配置して有効化します。既存のプラグインやテーマが同じ投稿タイプを登録している場合は、重複登録せず、その登録処理を調整してください。
<?php
/**
* Plugin Name: JBW Work Permalinks Example
* Description: 制作実績のURL構成のサンプル。
*/
defined( 'ABSPATH' ) || exit;
add_action( 'init', function () {
register_taxonomy( 'work_category', array( 'work' ), array(
'label' => '実績分類',
'public' => true,
'hierarchical' => true,
'show_in_rest' => true,
'rewrite' => array(
'slug' => 'work-category',
'with_front' => false,
'hierarchical' => false,
),
'default_term' => array(
'name' => 'その他',
'slug' => 'general',
),
) );
register_post_type( 'work', array(
'label' => '制作実績',
'public' => true,
'show_in_rest' => true,
'has_archive' => 'works',
'supports' => array( 'title', 'editor', 'thumbnail' ),
'taxonomies' => array( 'work_category' ),
'rewrite' => array(
'slug' => 'works/%work_category%',
'with_front' => false,
),
) );
} );
add_filter( 'post_type_link', function ( $url, $post ) {
if ( 'work' !== $post->post_type ) {
return $url;
}
$terms = wp_get_object_terms( $post->ID, 'work_category', array(
'orderby' => 'term_id',
'order' => 'ASC',
) );
if ( is_wp_error( $terms ) || empty( $terms ) ) {
return $url;
}
return str_replace( '%work_category%', $terms[0]->slug, $url );
}, 10, 2 );
add_action( 'template_redirect', function () {
if ( ! is_singular( 'work' ) || is_preview() ) {
return;
}
$requested = get_query_var( 'work_category' );
if ( ! $requested || has_term( $requested, 'work_category', get_queried_object_id() ) ) {
return;
}
global $wp_query;
$wp_query->set_404();
status_header( 404 );
nocache_headers();
remove_action( 'template_redirect', 'redirect_canonical' );
}, 0 );
rewrite のプレースホルダーがURLの受け口を作り、post_type_link が実際のリンクの分類部分を置き換えます。has_archive を文字列で指定して、一覧を /works/ に固定しています。with_front を無効にすることで、通常投稿の設定が /tips/%postname%/ でも、その接頭辞を付けません。公式:register_post_type、register_taxonomy、post_type_link
最後の処理はURL中のタームが記事に付いているか確認し、付いていない場合は404を返します。詳細ページでは投稿名で記事が見つかることがあるため、分類名の違うURLまで表示しないようにしています。複数のタームを付けた場合は、それぞれのURLが有効になるため、1記事1タームの運用を基本にしてください。
有効化した後の手順
- 「制作実績 → 実績分類」で
webなどのタームを作成します。 - 記事にタームを付けて保存します。既存記事にも漏れなく付けてください。
- 「設定 → パーマリンク」で設定を変えずに一度保存します。
- 記事・分類一覧・実績一覧を開き、一覧の2ページ目も確認します。
default_term は新規投稿での分類漏れを補う設定ですが、既存記事への一括付与はしません。タームがない記事ではプレースホルダーを置換できないため、そのまま公開しないでください。リライトルールの再生成を毎アクセス時に実行する必要もありません。
公開後に分類を変えるとURLも変わる
この構成はURLから内容を把握しやすい一方、タームの変更・削除・スラッグ変更が記事URLに影響します。分類を頻繁に見直すサイトなら、/works/sample/ に固定し、分類はパンくずなどで示す設計も候補です。
移行時は旧URLを一覧化し、対応する新URLへ301リダイレクトを設定します。このコードには旧URLの自動転送を含めていません。固定ページのスラッグとの衝突、SEOプラグインが出す正規URL、サイトマップも合わせて確認します。
実績や商品紹介のURL設計を相談する
JapanBlueWorksではカスタム投稿・分類の構築と既存サイトのURL構成の見直しをご相談いただけます。希望するURL例、現在のURL、分類を変更する頻度が分かると、運用に合う構成を検討できます。