セミナー告知やサービスメニュー、YouTube関連の資料置き場として、
固定ページを作成しています。
数が少ないうちは気になりませんが、
50ページを超えると、探すのもやや手間に。
そこで今回は、固定ページに「区分」を追加して整理できるようにしました。

まずは結論|固定ページを「区分」で整理できるようにした
今回は、固定ページに管理用の「区分」を追加するプラグインを自作しました。
固定ページのURLは変えず、管理画面上で分類・絞り込みができるようにしています。
具体的には、以下の見た目/使い方になります。
①固定ページ一覧
左端に「固定ページ区分」が追加されます。
▲▼をクリックすることで、昇順、降順の切り替えもできます。
ページ上部の「すべての固定ページ区分」で絞り込みも可能です。

②固定ページの編集画面
固定ページの編集画面右側に、
「固定ページ区分」という項目が追加されます。
ここで新たな区分を追加することも可能です。

③ダッシュボード
WordPress管理画面の「固定ページ」メニューに、
「固定ページ区分」が追加されます。
ここでも、分類の追加や名称変更をすることができます。

使い方
まず、以下のZIPファイルをダウンロードします。
中身はPHPファイル1つです。
コードも掲載しているので、内容を確認したい方はご覧ください。
コードの中身
<?php
/**
* Plugin Name: FTB 固定ページ区分
* Description: 固定ページに管理用の区分を追加します。
* Version: 1.0.2
* Author: free-to-blog.com
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* 固定ページ用タクソノミーを登録
*/
function ftbpg_register_taxonomy() {
$labels = array(
'name' => '固定ページ区分',
'singular_name' => '固定ページ区分',
'menu_name' => '固定ページ区分',
'all_items' => '固定ページ区分一覧',
'edit_item' => '区分を編集',
'view_item' => '区分を表示',
'update_item' => '区分を更新',
'add_new_item' => '区分を追加',
'new_item_name' => '新しい区分名',
'search_items' => '区分を検索',
'parent_item' => '親区分',
'parent_item_colon' => '親区分:',
'not_found' => '区分が見つかりません',
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
// 公開ページや分類URLを作らない
'public' => false,
'publicly_queryable' => false,
'rewrite' => false,
'query_var' => false,
// WordPress管理画面では使用する
'show_ui' => true,
'show_in_menu' => true,
'show_admin_column' => true,
'show_in_quick_edit' => true,
// ブロックエディターで区分を編集できるようにする
'show_in_rest' => true,
// ナビゲーションメニュー等には表示しない
'show_in_nav_menus' => false,
'show_tagcloud' => false,
);
register_taxonomy(
'ftb_page_group',
array( 'page' ),
$args
);
}
add_action( 'init', 'ftbpg_register_taxonomy' );
/**
* 固定ページ一覧で「固定ページ区分」列を左側に配置
*/
function ftbpg_move_admin_column_to_left( $columns ) {
$reordered_columns = array();
// 選択用チェックボックスは常に先頭に残す
if ( isset( $columns['cb'] ) ) {
$reordered_columns['cb'] = $columns['cb'];
unset( $columns['cb'] );
}
// 区分列をタイトルより左側に置く
if ( isset( $columns['taxonomy-ftb_page_group'] ) ) {
$reordered_columns['taxonomy-ftb_page_group'] = $columns['taxonomy-ftb_page_group'];
unset( $columns['taxonomy-ftb_page_group'] );
}
return array_merge( $reordered_columns, $columns );
}
add_filter( 'manage_page_posts_columns', 'ftbpg_move_admin_column_to_left' );
/**
* 「固定ページ区分」列をクリックで並べ替え可能にする
*/
function ftbpg_make_admin_column_sortable( $columns ) {
$columns['taxonomy-ftb_page_group'] = 'ftb_page_group';
return $columns;
}
add_filter(
'manage_edit-page_sortable_columns',
'ftbpg_make_admin_column_sortable'
);
/**
* 固定ページ区分の名前で固定ページ一覧を並べ替える
*/
function ftbpg_sort_pages_by_group( $clauses, $query ) {
global $wpdb;
if (
! is_admin()
|| ! $query->is_main_query()
|| 'page' !== $query->get( 'post_type' )
|| 'ftb_page_group' !== $query->get( 'orderby' )
) {
return $clauses;
}
$order = 'DESC' === strtoupper( $query->get( 'order' ) ) ? 'DESC' : 'ASC';
// 複数の区分がある場合は、名前順で最初の区分を並べ替えに使用する
$clauses['join'] .= " LEFT JOIN (
SELECT term_relationships.object_id, MIN( terms.name ) AS term_name
FROM {$wpdb->term_relationships} AS term_relationships
INNER JOIN {$wpdb->term_taxonomy} AS term_taxonomy
ON term_relationships.term_taxonomy_id = term_taxonomy.term_taxonomy_id
INNER JOIN {$wpdb->terms} AS terms
ON term_taxonomy.term_id = terms.term_id
WHERE term_taxonomy.taxonomy = 'ftb_page_group'
GROUP BY term_relationships.object_id
) AS ftbpg_sort_terms
ON {$wpdb->posts}.ID = ftbpg_sort_terms.object_id";
// 区分未設定のページは、昇順・降順どちらでも最後に表示する
$clauses['orderby'] = "ftbpg_sort_terms.term_name IS NULL ASC,
ftbpg_sort_terms.term_name {$order},
{$wpdb->posts}.post_title ASC";
return $clauses;
}
add_filter( 'posts_clauses', 'ftbpg_sort_pages_by_group', 10, 2 );
/**
* プラグイン有効化時に初期区分を作成
*/
function ftbpg_activate() {
// 有効化直後にもタクソノミーを認識させる
ftbpg_register_taxonomy();
$default_terms = array(
'セミナー・講座',
'サービス・商品',
'YouTube・配布資料',
'メルマガ・フォーム',
'基本・システムページ',
);
foreach ( $default_terms as $term_name ) {
if ( ! term_exists( $term_name, 'ftb_page_group' ) ) {
wp_insert_term(
$term_name,
'ftb_page_group'
);
}
}
}
register_activation_hook( __FILE__, 'ftbpg_activate' );
/**
* 固定ページ一覧に区分の絞り込み欄を追加
*/
function ftbpg_add_filter_dropdown( $post_type, $which ) {
if ( 'page' !== $post_type || 'top' !== $which ) {
return;
}
$selected = 0;
if ( isset( $_GET['ftb_page_group_filter'] ) ) {
$selected = absint(
wp_unslash( $_GET['ftb_page_group_filter'] )
);
}
echo '<label class="screen-reader-text" for="ftb-page-group-filter">';
echo '固定ページ区分で絞り込む';
echo '</label>';
wp_dropdown_categories(
array(
'show_option_all' => 'すべての固定ページ区分',
'taxonomy' => 'ftb_page_group',
'name' => 'ftb_page_group_filter',
'id' => 'ftb-page-group-filter',
'orderby' => 'name',
'selected' => $selected,
'hide_empty' => false,
'hierarchical' => true,
'value_field' => 'term_id',
)
);
}
add_action(
'restrict_manage_posts',
'ftbpg_add_filter_dropdown',
10,
2
);
/**
* 選択された区分で固定ページ一覧を絞り込む
*/
function ftbpg_apply_admin_filter( $query ) {
if (
! is_admin()
|| ! $query->is_main_query()
|| 'page' !== $query->get( 'post_type' )
) {
return;
}
if ( empty( $_GET['ftb_page_group_filter'] ) ) {
return;
}
$term_id = absint(
wp_unslash( $_GET['ftb_page_group_filter'] )
);
if ( ! $term_id ) {
return;
}
$query->set(
'tax_query',
array(
array(
'taxonomy' => 'ftb_page_group',
'field' => 'term_id',
'terms' => $term_id,
),
)
);
}
add_action( 'pre_get_posts', 'ftbpg_apply_admin_filter' );
ダッシュボードから「プラグインの追加」をクリック。

続いて、
プラグインのアップロード
→ファイルを選択(上記のZIPファイル)
→今すぐインストール
の順番で進めます。

インストールが完了したら「有効化」をクリックしましょう。

以上で、固定ページの区分を追加できるようになります。
なお、私が使っている初期区分が5つ登録されます。
不要な区分は削除・名称変更してお使いください。
他に選択肢はないのか
もちろん、他の選択肢によっても同じようなことは実現できます。
- 固定ページの親子関係を使う(標準機能)
→親ページを設定するとURLの階層も変わるため不採用。 - 既存プラグイン(Custom Post Type UIなど)を使う
→今回使わない機能も多く、(私には)設定もやや複雑に感じたため不採用。 - カスタム投稿タイプ(CPT)化
→セミナーだけ分けるのはアリだと思ったが、今回の目的と少しズレる。
今回は、
- 既存の固定ページURLを変えない
- 固定ページのまま使う
- 必要な機能だけ追加する
という点を重視して、自作プラグインを選びました。
まとめ
固定ページを分類するだけなら、既存プラグインを使う方法もあります。
ただ、今回のように「欲しい機能がはっきりしている」のであれば、
AIと相談しながら小さくプラグインを自作するのもアリかなぁと。
必要な機能だけに絞れるので、
仕組みもシンプルにできます。
「管理だけが目的」にならないよう注意したいところですが、
固定ページが増えて探しづらくなってきた方は、試してみていただければ。
では、また次回。
編集後記
◇日記
昨日はChatGPT×Chromeセミナーを開催。
開催後、動画販売ページの作成なども。
◇ブログネタ経緯
固定ページ区分を追加したので、実践したことを記事に。
◇1日1新
ChatGPT×Chromeセミナー
魚べいイカ刺身