
本日は業務メモです。ワードプレスの投稿画面でカテゴリーの挙動を制御したい場面での対応。ブログを投稿するカテゴリー構造を「親カテゴリー」に属する「子カテゴリー」としたい場合で更新者さんに「子カテゴリー」のみにチェックを入れて運用して欲しいケースがあります。つまり、制御した後の状態は子カテゴリーは選べても「親カテゴリー」にチェックマークが入れられないようにするカスタマイズです。
通常のカテゴリー選択画面が以下です。
当然ですが、チェックボックスを押すとカテゴリーが選択されて有効になります。
ただ、親カテゴリーを「カテゴリー全記事」として運用するシチュエーションでは、親カテゴリー自体にチェックをいれて欲しくない場合があります。記事のカテゴライズを子カテゴリーのみで行えると投稿が自然と整理されるので個別カテゴリーとしてメニューを分けられたりして柔軟な作りになるからです。
もし口頭で「ブログ記事を書くときは子カテゴリーにチェックをしてくださいね」と伝えていても「親カテゴリー」にチェックが入れられる状態だったら何かの拍子にチェックをしてしまう可能性が高いです。
たとえば、下記のカテゴリー構造とすると
□ブログ (親カテゴリー)
└□笑顔になる話 (子カテゴリー)
└□本日のランチ (子カテゴリー)
└□週末おでかけ (子カテゴリー)
週末ランチで笑顔になった話だと全部に該当するので「ブログ」を選びたくなる状況になるわけです。そして迷った結果「親カテゴリー」の「ブログ」にチェックをしてしまい、ウェブサイト側で行なっていたメニュー構造(情報整理)と少しずつ不整合が出て来てしまって来訪者に混乱を招いてしまいます。
上記を事前にさけるためには「親カテゴリー」そのものをチェックできない状態にして「選べなくする」のがベストです。そして制御するためのカスタマイズ(functions.phpに追記)が下記となります。
//親カテゴリーをチェックできないようにする
require_once(ABSPATH . '/wp-admin/includes/template.php');
class Parent_Category_Checklist extends Walker_Category_Checklist {
function start_el( &$output, $category, $depth, $args, $id = 0 ) {
extract($args);
if ( empty($taxonomy) )
$taxonomy = 'category';
if ( $taxonomy == 'category' )
$name = 'post_category';
else
$name = 'tax_input['.$taxonomy.']';
$class = in_array( $category->term_id, $popular_cats ) ? ' class="popular-category"' : '';
$cat_child = get_category_children($category->term_id);
if($cat_child !== "") {
$output .= "\n<li id='{$taxonomy}-{$category->term_id}'$class>" . '<label class="selectit"><input value="' . $category->term_id . '" type="checkbox" name="'.$name.'[]" id="in-'.$taxonomy.'-' . $category->term_id . '"' . checked( in_array( $category->term_id, $selected_cats ), true, false ) . disabled( empty( $args['disabled'] ), true, false ) . ' /> ' . esc_html( apply_filters('the_category', $category->name )) . '</label>';
}else{
$output .= "\n<li id='{$taxonomy}-{$category->term_id}'$class>" . '<label class="selectit"><input value="' . $category->term_id . '" type="checkbox" name="'.$name.'[]" id="in-'.$taxonomy.'-' . $category->term_id . '"' . checked( in_array( $category->term_id, $selected_cats ), true, false ) . disabled( empty( $args['disabled'] ), false, false ) . ' /> ' . esc_html( apply_filters('the_category', $category->name )) . '</label>';
}
}
}
function wp_category_no_top_terms_checklist( $args, $post_id = null ) {
$args['checked_ontop'] = false;
$args['walker'] = new Parent_Category_Checklist();
return $args;
}
add_action( 'wp_terms_checklist_args', 'wp_category_no_top_terms_checklist' );
適用すると、無事「親カテゴリー」のチェックボックスが押せなくなりました。
親カテゴリーにdisabled="disabled"
を付与してチェックを入れられないように変更、そしてCSSで見た目を半透明にしてチェックボックスが使えない見栄えにしてしまうというカスタマイズ方法です。
状況によっては「子カテゴリー」は1つしか選べない方がよい状況だってあります。こちらの制御方法は別の記事にてご紹介させていただきます。カテゴリーの運営基準1つとってもワードプレスは奥が深い。
特に更新者が不慣れな初心者さんの場合はあらかじめ管理画面を制御しておいた方が結果的に運営がスムーズに回ります。トラブルが発生する前に事前対策をしていきましょう。WP4系のクラシックエディターでの制御方法となりますのでWP5系のエディターでは上記のスクリプトは効きません。もしWP5系を使っている方はプラグイン新規追加から「Classic Editor」をインストールして運営をお試しくださいませ。
Classic Editorはプラグインの追加画面に行けばすぐに見つかるのでご安心ください。
【今すぐ無料プラグインを手に入れる】
→ 無料ダウンロードはこちら