WordPressのカスタム投稿タイプで階層化に対応する方法

WordPressでは、デフォルトで「投稿(post)」は階層構造を持ちませんが、「固定ページ(page)」は親子関係を設定できます。独自に追加したカスタム投稿タイプでも、適切な設定を行うことで階層化に対応することが可能です。

1. カスタム投稿タイプの登録時に階層化を有効にする

まず、register_post_type() 関数を使用してカスタム投稿タイプを登録する際に、hierarchicaltrue に設定します。また、supportspage-attributes を追加することで、管理画面で親ページを設定できるようになります。

function create_custom_post_type() {
    $args = array(
        'labels' => array(
            'name' => 'カスタム投稿',
            'singular_name' => 'カスタム投稿'
        ),
        'public' => true,
        'hierarchical' => true, // 階層化を有効にする
        'supports' => array('title', 'editor', 'thumbnail', 'page-attributes'), // 'page-attributes' を追加
        'rewrite' => array('slug' => 'custom-post', 'with_front' => false),
        'has_archive' => true
    );
    register_post_type('custom_post', $args);
}
add_action('init', 'create_custom_post_type');

これで、管理画面の「カスタム投稿」の編集画面で親ページを選択できるようになります。


2. 「順序(Order)」フィールドを非表示にする

カスタム投稿タイプでpage-attributesをサポートすると、「親ページ」選択のほかに「順序(Order)」フィールドも表示されます。順序を使用しない場合は、以下のコードで非表示にすることができます。

function remove_page_order_metabox() {
    remove_meta_box('pageparentdiv', 'custom_post', 'side');

    add_meta_box(
        'parent-post', // メタボックスID
        __('親ページ'), // メタボックスのタイトル
        'custom_parent_meta_box', // コールバック関数
        'custom_post', // 対象の投稿タイプ
        'side', // 配置位置('normal', 'advanced', 'side')
        'high' // 優先度('high', 'core', 'default', 'low')
    );
}
add_action('add_meta_boxes', 'remove_page_order_metabox');

function custom_parent_meta_box($post) {
    $dropdown_args = array(
        'post_type'        => $post->post_type,
        'exclude_tree'     => $post->ID,
        'selected'         => $post->post_parent,
        'name'             => 'parent_id',
        'show_option_none' => __('(なし)'),
        'sort_column'      => 'menu_order, post_title',
        'echo'             => 1,
    );
    ?>
    <p><strong><?php _e('親ページ'); ?></strong></p>
    <?php wp_dropdown_pages($dropdown_args); ?>
    <?php
}

このコードを適用すると、「順序(Order)」フィールドは非表示 になりますが、「親ページ」の選択はそのまま利用できます。


3. カスタム投稿タイプのパーマリンクを親子構造に対応させる

デフォルトのパーマリンクでは、post_name しか使われないため、親子関係を反映させたURLにするために post_type_link フィルターを使ってカスタマイズします。

function custom_post_permalink($post_link, $post) {
    if ($post->post_type === 'custom_post') {
        $parent = get_post($post->post_parent);
        if ($parent) {
            $post_link = home_url('/custom-post/' . $parent->post_name . '/' . $post->post_name . '/');
        } else {
            $post_link = home_url('/custom-post/' . $post->post_name . '/');
        }
    }
    return $post_link;
}
add_filter('post_type_link', 'custom_post_permalink', 10, 2);

このコードを追加すると、以下のようなURL構造になります。

記事の状態URL
親なし/custom-post/sample-post/
親あり/custom-post/parent-post/child-post/

まとめ

カスタム投稿タイプを階層構造に対応させるには、以下のステップを踏みます。

  1. register_post_type()hierarchical => true を設定し、page-attributes をサポートする。
  2. 「順序(Order)」フィールドを非表示にする。
  3. post_type_link をカスタマイズして、親子構造のパーマリンクを設定する。
  4. rewrite_rules_array を追加して、リライトルールを適用する。
  5. 階層構造を考慮したパンくずリストを作成する。

これらの設定を適用することで、WordPressのカスタム投稿タイプでも親子関係を持つページを構築できます。

コメント

タイトルとURLをコピーしました