WordPressでは、デフォルトで「投稿(post)」は階層構造を持ちませんが、「固定ページ(page)」は親子関係を設定できます。独自に追加したカスタム投稿タイプでも、適切な設定を行うことで階層化に対応することが可能です。
1. カスタム投稿タイプの登録時に階層化を有効にする
まず、register_post_type()
関数を使用してカスタム投稿タイプを登録する際に、hierarchical
を true
に設定します。また、supports
に page-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/ |
まとめ
カスタム投稿タイプを階層構造に対応させるには、以下のステップを踏みます。
register_post_type()
でhierarchical => true
を設定し、page-attributes
をサポートする。- 「順序(Order)」フィールドを非表示にする。
post_type_link
をカスタマイズして、親子構造のパーマリンクを設定する。rewrite_rules_array
を追加して、リライトルールを適用する。- 階層構造を考慮したパンくずリストを作成する。
これらの設定を適用することで、WordPressのカスタム投稿タイプでも親子関係を持つページを構築できます。
コメント