WordPressでは投稿編集画面でカテゴリやタグをチェックボックス・入力欄で選択できますが、選択肢が多くなると見づらく、操作性が低下します。特にタクソノミーの項目が大量にある場合、標準UIでは目的の項目を探すのが大変です。そこで本記事では、カテゴリやタグをモーダル(ポップアップ)で選択するUIに変更する実装方法を紹介します。
この記事で紹介する実装は、投稿編集画面の
#categorydiv(クラシックエディタのカテゴリーメタボックス)の存在を前提としています。WordPress 5.0以降のブロックエディタ(Gutenberg)はメタボックスを登録せず、カテゴリー選択を独自のReactパネルとして実装しているため、標準の投稿(show_in_restが既定でtrue)の編集画面には#categorydivがそもそも存在しません。ブロックエディタ使用中にこのコードを適用すると、モーダル自体は開いてもエラーも出ずに「決定」を押した内容が投稿に反映されないという、気づきにくい不具合になります。Classic Editorプラグインを使っている、またはそのタクソノミーがshow_in_rest=falseでブロックエディタのパネルに対応していない場合に限り有効な手法です。モーダル実装の概要
モーダルUIでは、投稿編集画面内にあるカテゴリ選択部分を非表示にし、「カテゴリを選択」ボタンをクリックしたときにポップアップウィンドウで選択肢を表示します。ユーザーはモーダル内でカテゴリをチェックし、「決定」ボタンで反映させることができます。
投稿編集画面にモーダルUIを追加する
以下のコードをテーマのfunctions.phpに追加し、モーダル用のHTMLとJSを投稿編集画面に読み込みます。ブロックエディタが使われている場合は処理をスキップするガードを入れています。
// 投稿編集画面にモーダル用HTMLとJSを追加(クラシックエディタ専用)
function add_category_modal_ui() {
$screen = get_current_screen();
if ($screen->post_type !== 'post') return;
// ブロックエディタ(Gutenberg)では#categorydivが存在せず機能しないため対象外にする
if (method_exists($screen, 'is_block_editor') && $screen->is_block_editor()) return;
?>
<style>
.category-modal { display: none; position: fixed; top: 10%; left: 50%; transform: translateX(-50%); width: 500px; max-height: 70%; overflow-y: auto; background: #fff; border: 1px solid #ccc; padding: 20px; z-index: 10000; }
.category-modal-overlay { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.6); z-index: 9999; }
</style>
<div class="category-modal-overlay"></div>
<div class="category-modal">
<h2>カテゴリを選択</h2>
<ul>
<?php
$categories = get_categories(array('hide_empty' => false));
foreach ($categories as $cat) {
echo '<li><label><input type="checkbox" value="' . esc_attr($cat->term_id) . '" class="js-cat-check">' . esc_html($cat->name) . '</label></li>';
}
?>
</ul>
<button type="button" class="button js-cat-modal-confirm">決定</button>
<button type="button" class="button js-cat-modal-close">閉じる</button>
</div>
<script>
jQuery(document).ready(function($) {
// 元のカテゴリーUIを非表示
$('#categorydiv').hide();
// トリガーボタンを追加
$('#categorydiv').before('<button type="button" class="button js-cat-modal-open">カテゴリを選択</button>');
$('.js-cat-modal-open').on('click', function() {
$('.category-modal, .category-modal-overlay').fadeIn();
});
$('.js-cat-modal-close, .category-modal-overlay').on('click', function() {
$('.category-modal, .category-modal-overlay').fadeOut();
});
$('.js-cat-modal-confirm').on('click', function() {
// チェックされたIDだけ反映
const selectedIds = [];
$('.js-cat-check:checked').each(function() {
selectedIds.push($(this).val());
});
// 元のチェックボックスに反映
$('#categorydiv input[type="checkbox"]').prop('checked', false);
selectedIds.forEach(id => {
$('#categorydiv input[value="' + id + '"]').prop('checked', true);
});
$('.category-modal, .category-modal-overlay').fadeOut();
});
});
</script>
<?php
}
add_action('admin_footer-post.php', 'add_category_modal_ui');
add_action('admin_footer-post-new.php', 'add_category_modal_ui');
get_current_screen()->is_block_editor()(WordPress 5.0で導入)を使うことで、現在の編集画面がブロックエディタかどうかを判定できます。これによりブロックエディタ環境では無条件に処理をスキップし、動作しないUIが表示されてしまう事態を防げます。
タグ選択もモーダル対応にするには
タグ(非階層のタクソノミー)にも同様のUIを適用できます。get_terms()関数でタグ一覧を取得し、入力ではなくチェックボックスで選択させる形に変更することで、誤入力や重複のリスクも軽減できます。
必要に応じてpost_tagを対象にしたJS処理を追加し、モーダルでタグを複数選択→テキストエリアに反映、という仕組みも可能です。ただしタグについても、ブロックエディタのタグパネルは同様にReactで実装されているため、上記と同じクラシックエディタ限定の制約が当てはまります。
よくある質問(FAQ)
まとめ
カテゴリやタグをモーダルUIにすることで、項目数が多い場合でもユーザーは見やすく・選びやすくなります。特に多階層のカテゴリや100件以上のタグがあるような大規模な投稿管理において、UXの向上に大きく貢献します。ただしこの手法はクラシックエディタの仕組みに依存しているため、ブロックエディタを使用している場合は動作しない点に注意してください。
WordPress管理画面を実用的にカスタマイズしたい場合は、今回のようなモーダル導入をぜひ検討してみてください。

