【WordPress】固定ページが増えすぎたので「区分」を自作して整理した

セミナー告知やサービスメニュー、YouTube関連の資料置き場として、
固定ページを作成しています。

数が少ないうちは気になりませんが、
50ページを超えると、探すのもやや手間に。

そこで今回は、固定ページに「区分」を追加して整理できるようにしました。

Contents

まずは結論|固定ページを「区分」で整理できるようにした

今回は、固定ページに管理用の「区分」を追加するプラグインを自作しました。
固定ページのURLは変えず、管理画面上で分類・絞り込みができるようにしています。

具体的には、以下の見た目/使い方になります。

①固定ページ一覧

左端に「固定ページ区分」が追加されます。
▲▼をクリックすることで、昇順、降順の切り替えもできます。
ページ上部の「すべての固定ページ区分」で絞り込みも可能です。


②固定ページの編集画面

固定ページの編集画面右側に、
「固定ページ区分」という項目が追加されます。

ここで新たな区分を追加することも可能です。

③ダッシュボード

WordPress管理画面の「固定ページ」メニューに、
「固定ページ区分」が追加されます。

ここでも、分類の追加や名称変更をすることができます。

使い方

まず、以下のZIPファイルをダウンロードします。

📁ftb-page-group.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セミナー
 魚べいイカ刺身

よかったらシェアしてね!
  • URLをコピーしました!
Contents