WORDPRESS TIPS

カスタム投稿のURLにタームを入れる方法|/works/分類/記事名/の実装例

カスタム投稿の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タームの運用を基本にしてください。

有効化した後の手順

  1. 「制作実績 → 実績分類」で web などのタームを作成します。
  2. 記事にタームを付けて保存します。既存記事にも漏れなく付けてください。
  3. 「設定 → パーマリンク」で設定を変えずに一度保存します。
  4. 記事・分類一覧・実績一覧を開き、一覧の2ページ目も確認します。

default_term は新規投稿での分類漏れを補う設定ですが、既存記事への一括付与はしません。タームがない記事ではプレースホルダーを置換できないため、そのまま公開しないでください。リライトルールの再生成を毎アクセス時に実行する必要もありません。

公開後に分類を変えるとURLも変わる

この構成はURLから内容を把握しやすい一方、タームの変更・削除・スラッグ変更が記事URLに影響します。分類を頻繁に見直すサイトなら、/works/sample/ に固定し、分類はパンくずなどで示す設計も候補です。

移行時は旧URLを一覧化し、対応する新URLへ301リダイレクトを設定します。このコードには旧URLの自動転送を含めていません。固定ページのスラッグとの衝突、SEOプラグインが出す正規URL、サイトマップも合わせて確認します。

実績や商品紹介のURL設計を相談する

JapanBlueWorksではカスタム投稿・分類の構築と既存サイトのURL構成の見直しをご相談いただけます。希望するURL例、現在のURL、分類を変更する頻度が分かると、運用に合う構成を検討できます。

カスタム投稿とURL構成を相談する

← Tips一覧へ