投稿内のコンテンツをログインユーザーのみに公開する方法はありますか?
想定されるユースケースは、バーチャルイベントの投稿です。コミュニティには多くのワーキンググループがあり、それらは仮想的に会議を行っています。カジュアルな訪問者には、グループや会議が存在すること、そしてそれがいつ開催されるかを知ってもらいたいのですが、Zoomリンクを公開したくはありません。
投稿内のコンテンツをログインユーザーのみに公開する方法はありますか?
想定されるユースケースは、バーチャルイベントの投稿です。コミュニティには多くのワーキンググループがあり、それらは仮想的に会議を行っています。カジュアルな訪問者には、グループや会議が存在すること、そしてそれがいつ開催されるかを知ってもらいたいのですが、Zoomリンクを公開したくはありません。
マーティさん、こんにちは!
ウィスパー投稿にはそのような機能があります:Creating a whisper post
ウィスパー投稿は投稿後に「アンウィスパー」することはできませんが、このテーマコンポーネントを使用すると可能です:Toggle Whisper 👁
ありがとうございます。それに近いです。理想的なのは、投稿内のコンテンツをフォーマットする方法で、投稿の残りはすべての人に表示され、ログインしていない場合は「ログインユーザーのみ利用可能なリンク」のようなメッセージが表示されることですが、今のところウィスパーでうまくいくようです。
初心者管理者なので、まだすべての機能の使い方を模索中です。
Discourse のカスタマイズについてはあまり詳しくありませんが、それは少しトリッキーなようで、クライアントサイドのコードをいじる方法を知っている人に回避されたくない場合はプラグインが必要になりそうです。
ログインしていないユーザーからフロントエンドで投稿を非表示にできるテーマコンポーネントを開発しました。もちろん、豊富な開発経験を持つ人であれば、バックエンドから簡単に取得できます。
このコンポーネントはまだパッケージ化していないため、以下のコードを直接使用してください。
ヘッドタグ:
api.addPostClassesCallback((attrs) => {
if (attrs?.cooked?.includes(`<div>`)) {
return ["lycoris-hiddened"];
} else {
return [];
}
});
if (!user) {
api.decorateCookedElement((el, helper) => {
function hide_post() {
setTimeout(() => {
try {
document.querySelector(`[data-post-id="${helper?.widget?.attrs?.id}"]`)?.parentElement?.remove();
} catch (err) {
console.log(el);
console.log(err);
}
}, 1000);
}
if (el?.querySelector(`[data-theme-hide="true"]`)) {
el.innerHTML = `<p>この投稿は非表示です</p>`;
hide_post();
}
}, {
id: pid,
afterAdopt: true,
onlyStream: true,
});
} else if (user?.trust_level == 4) {
const s = document.createElement("style");
s.innerHTML = tl4_css;
document.body.appendChild(s);
api.decorateCookedElement((el, helper) => {
if (el?.querySelector(`[data-theme-hide="true"]`)) {
el.innerHTML = `<div class="d-wrap" data-wrap="tips" data-type="warn"><p>投稿はコミュニティの未ログインユーザーに非表示に設定されています</p></div> ` + el.innerHTML;
}
}, {
id: pid,
afterAdopt: true,
onlyStream: true,
});
if (!I18n.translations[I18n.currentLocale()].js.composer) {
I18n.translations[I18n.currentLocale()].js.composer = {};
}
I18n.translations[I18n.currentLocale()].js.composer.hide_text = " ";
I18n.translations[I18n.currentLocale()].js.composer.make_hide = "この投稿を非表示にする";
api.modifyClass("controller:composer", {
pluginId: pid,
actions: {
insertHide() {
this.get("toolbarEvent").applySurround(
`<div data-theme-hide="true">`,
`</div>\n`,
"hide_text"
);
},
},
});
api.addToolbarPopupMenuOptionsCallback(() => {
return {
action: "insertHide",
icon: "far-eye-slash",
label: "composer.make_hide",
};
});
}
CSS
.anon .lycoris-hiddened {
display: none;
.post-info.edits {
display: none;
}
}