WordPressを複数人で運用していると、投稿者が誤ったカテゴリやタグを選択してしまい、記事の分類や表示に不整合が生じることがあります。こうした問題を防ぐには、投稿者ごとに選べるカテゴリやタグを制限するカスタマイズが有効です。
この記事では、特定のユーザー(またはユーザーID)に対して、投稿画面で選択できるカテゴリやタグを制御する方法を紹介します。
対象ユーザーを特定し、表示するカテゴリを制限する
以下のコードを functions.php に追加することで、特定のユーザーにだけ、特定のカテゴリのみを表示・選択できるように制御できます。
functions.php:ユーザー別のカテゴリ表示制限
<?php
function restrict_categories_for_specific_user( $args, $taxonomy ) {
// 対象とするユーザーのID
$restricted_user_id = 5;
// get_terms_argsの第2引数は常に配列で渡されるため in_array() で確認する
if ( get_current_user_id() === $restricted_user_id && in_array( 'category', (array) $taxonomy, true ) ) {
// 表示を許可するカテゴリID
$allowed_category_ids = array( 3, 7, 15 );
$args['include'] = $allowed_category_ids;
}
return $args;
}
add_filter( 'get_terms_args', 'restrict_categories_for_specific_user', 10, 2 );
?>
このコードでは、ユーザーID「5」の投稿者に対して、IDが「3」「7」「15」のカテゴリしか表示・選択できないようにしています。
$taxonomy === ‘category’では常にfalseになり制限が効かない
get_terms_argsフィルターの第2引数は、常に配列(例:array('category'))で渡されます。get_terms()の内部では、フィルターを適用する前に必ずタクソノミーを配列へ正規化する処理が入っているためです。$taxonomy === 'category'のように文字列と直接比較すると、「配列」と「文字列」を比較することになり常にfalseになります。エラーも出ないため、制限がかかっていないことに気づきにくい点に注意してください。in_array('category', (array) $taxonomy, true)のように、配列であることを前提とした比較にする必要があります。タグ(post_tag)の制限も可能
$taxonomy に 'post_tag' が含まれる場合にも同様の方法で制限が可能です。以下のように条件分岐を追加してください。
タグの制限
if ( get_current_user_id() === $restricted_user_id && in_array( 'post_tag', (array) $taxonomy, true ) ) {
$args['include'] = array( 12, 22, 35 ); // 許可するタグID
}
これにより、不要なタグの乱立や、分類ミスを未然に防ぐことができます。
複数ユーザーに対応させる場合
複数の投稿者に異なる制限をかけたい場合は、switch 文などでユーザーごとの制御を行います。
複数ユーザーへの対応
switch ( get_current_user_id() ) {
case 5:
if ( in_array( 'category', (array) $taxonomy, true ) ) {
$args['include'] = array( 3, 7 );
}
break;
case 8:
if ( in_array( 'category', (array) $taxonomy, true ) ) {
$args['include'] = array( 4, 9 );
}
break;
}
こうした柔軟な制御により、ユーザーごとに役割や担当領域を明確化することができます。
注意点
- この制御は「表示の制限」であり、既に割り当てられているカテゴリやタグを外すものではありません。
- カテゴリやタグのIDは
投稿 > カテゴリーのURL末尾(tag_ID=◯)から確認できます。 - ユーザーIDは
ユーザー編集画面のURL(user_id=◯)で確認できます。
よくある質問(FAQ)
Q投稿者ロールが使えるカテゴリーを特定のものに制限するには?
Aget_terms_argsフィルターで現在のユーザーが使えるタームのみを返すようにフィルタリングします。第2引数は配列で渡されるため、in_array()での比較が必要です。
Q特定ユーザーに特定タクソノミーの使用を制限する方法は?
Auser_has_capフィルターでassign_termsケイパビリティを上書きし、特定タクソノミーへの割り当てを制限します。ACFのフィールドグループ表示条件と組み合わせることもできます。
Qユーザーグループ別のカテゴリー権限管理にプラグインはありますか?
AMembers・User Role Editor・Adminimize等のプラグインでロール別のケイパビリティ管理が可能です。より細かいタクソノミーレベルの制御にはCustom Capabilities等の専門プラグインが有用です。
まとめ
WordPressでは、投稿者ごとに編集可能なカテゴリやタグを制限することで、分類ミスや不要なタグの乱立を防止し、運用の安定性を高めることができます。
とくに、特定のジャンル担当者や外部寄稿者がいる場合は、今回のような制御を取り入れることで、サイト全体の構造を維持しやすくなります。get_terms_argsフィルターを使う際は、第2引数が配列で渡される点を忘れずに比較しましょう。

