本日、この問題に直面しました。
https://meta.discourse.org/t/required-tags-should-only-be-required-based-on-type-of-user/392238
しかし、チームが対応してくれるまでの間(そう願っています)、Composerにカスタムメッセージを追加してタグの追加をリマインドするコンポーネントを作成するためにClaudeに協力を求めました。IDで1人以上のユーザーを追加でき、IDで特定のカテゴリに制限することもできます。
ID(ユーザーとカテゴリ)がリストにない場合、次のように表示されます。

IDがリストにある場合、メッセージが表示されます。

これが他の人にも役立つなら、ここにあります(コンポーネントを作成し、JSタブにスクリプトを追加するだけです)。
import { apiInitializer } from "discourse/lib/api";
export default apiInitializer("0.8.31", (api) => {
// 設定: ここにユーザーIDとカテゴリIDを追加してください
const TARGET_USER_IDS = [2]; // 実際のユーザーIDに置き換えてください
const TARGET_CATEGORY_IDS = [4,49]; // 実際のカテゴリIDに置き換えてください
const REMINDER_MESSAGE = "🛑 適切なタグをこの投稿に追加してください!";
let previousCategoryId = null;
let checkInterval = null;
function checkAndUpdateMessage() {
const composer = api.container.lookup("controller:composer");
if (!composer || !composer.model) {
// Composerが消えたので、チェックを停止します
if (checkInterval) {
clearInterval(checkInterval);
checkInterval = null;
}
return;
}
const currentUser = api.getCurrentUser();
if (!currentUser || !TARGET_USER_IDS.includes(currentUser.id)) return;
const model = composer.model;
const categoryId = model.categoryId;
// カテゴリが変更された場合にのみ処理
if (categoryId === previousCategoryId) return;
previousCategoryId = categoryId;
const currentReply = model.reply || "";
// メッセージが追加されていた場合は削除
if (currentReply.startsWith(REMINDER_MESSAGE)) {
model.set("reply", currentReply.replace(REMINDER_MESSAGE, "").trim());
}
// 対象カテゴリ内にあり、Composerが空の場合にメッセージを追加
if (categoryId && TARGET_CATEGORY_IDS.includes(categoryId)) {
const cleanReply = model.reply || "";
if (cleanReply.trim().length === 0) {
model.set("reply", REMINDER_MESSAGE);
}
}
}
// Composerが開いたときにチェック
api.onAppEvent("composer:opened", () => {
previousCategoryId = null;
checkAndUpdateMessage();
// カテゴリ変更をポーリングするために開始
if (checkInterval) clearInterval(checkInterval);
checkInterval = setInterval(checkAndUpdateMessage, 300);
});
// Composerが閉じられたときにチェックを停止
api.onAppEvent("composer:closed", () => {
if (checkInterval) {
clearInterval(checkInterval);
checkInterval = null;
}
previousCategoryId = null;
});
});