是否有办法让帖子内的内容仅供登录用户访问?
我考虑的使用场景是虚拟活动发布。我们的社区有很多工作组以虚拟方式开会。我们希望让普通访客知道这些小组和会议的存在——以及它们发生的时间——但我们不想公开张贴 Zoom 链接。
是否有办法让帖子内的内容仅供登录用户访问?
我考虑的使用场景是虚拟活动发布。我们的社区有很多工作组以虚拟方式开会。我们希望让普通访客知道这些小组和会议的存在——以及它们发生的时间——但我们不想公开张贴 Zoom 链接。
谢谢。这很接近了。理想的情况是有一种方法可以在帖子中格式化内容,以便帖子的其余部分对所有人可见,并且如果您未登录,则会显示“链接仅对登录用户可用”之类的消息,但看起来耳语目前效果很好。
我是新手管理员,所以仍在尝试找到所有功能。
我对 Discourse 的修改了解不多,但这似乎有点棘手,并且需要一个插件,如果您不希望它被知道如何调整客户端代码的人绕过的话。
我开发了一个主题组件,允许隐藏前端未登录用户可见的帖子。当然,如果他们是经验丰富的开发人员,他们可以轻松地直接从后端获取。
我还没有打包这个组件,所以请直接使用下面的代码。
Head Tag:
const user = api.getCurrentUser();
const I18n = require("I18n");
const pid = "post_hider"
const tl4_css = `
.d-editor-preview [data-theme-hide] {
background: var(--tertiary);
color: var(--secondary);
border-top: 2px solid var(--secondary);
position: sticky;
top: 0;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
}
.d-editor-preview [data-theme-hide]::before {
content: "This post is hidden";
}
`
api.addPostClassesCallback((attrs) => {
if (attrs?.cooked?.includes(`<div> data-theme-hide="true">`)) {
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>This post is hidden</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 = "Hide this post";
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;
}
}