使用 JS 获取类别名称

你好,或许有人能帮忙。
我需要获取当前页面的分类名称。
我需要在可以添加到页脚或主体部分的 JS 脚本中实现这一点。
我已经尝试了几种方案,但无法使其稳定运行,尤其是在用户进行页面跳转时。
我计划将最终获取的分类名称作为事件传递给 Google Analytics,以统计每个分类的访问量。

可能有一种方法可以在主题页面和分类页面上一致地实现,但我通过两种不同的方式获取了分类 ID……一种用于分类页面:

<script type="text/discourse-plugin" version="0.8">
const container = Discourse.__container__;
const controller = container.lookup('controller:navigation/category');

api.onPageChange((url, title) => {
  console.log(controller.get("category.id"));
});
</script>

另一种类似的方式用于主题页面:

<script type="text/discourse-plugin" version="0.8">
const container = Discourse.__container__;
const controller = container.lookup('controller:topic');

api.onPageChange((url, title) => {
  console.log(controller.get("model.category_id"));
});
</script>

在分类页面的示例中,您也可以使用 category.namecategory.slug,但在主题模型中,只有 category_id 可用,因此您需要做更多工作来获取名称。无论如何,使用 ID 可能是更好的选择,因为即使分类名称或 slug 发生变化,ID 也能保持一致。

9 个赞

我成功获取了分类页面和主题页面的分类 ID,
但当我进入常见问题(FAQ)或其他页面时,仍会显示上一页的分类 ID。
该如何排除这种情况?

以下是我的代码,它目前可以运行,但我对 JavaScript 并不熟悉。

<script type="text/discourse-plugin" version="0.8">
const container = Discourse.__container__;

api.onPageChange((url, title) => {
    const topic = container.lookup('controller:topic');
    const topic_cat_id = topic.get("model.category_id");
    if(typeof topic_cat_id !== "undefined")
    {
        gtag('event', 'Categories Views Analytics', {
            'event_category': 'Topic Page',
            'event_label': topic_cat_id,
        });
        console.log("Topic " + topic_cat_id);
    } else {
        const category = container.lookup('controller:navigation/category');
        const category_cat_id = category.get("category.id");  

        if(typeof category_cat_id !== "undefined") 
        {
            gtag('event', 'Categories Views Analytics', {
                'event_category': 'Category Page',
                'event_label': category_cat_id,
            });  
            console.log("Category " + category_cat_id);
        } else {
            gtag('event', 'Categories Views Analytics', {
                'event_category': 'Other Page',
                'event_label': 'Other Page'
            });              
            console.log("Other");
        }
    }
});
</script>

我可能在变量处理上出了错,或者需要获取其他类型页面的控制器。

1 个赞