Bonjour, peut-être que quelqu’un peut m’aider.
J’ai besoin d’obtenir le nom de la catégorie de la page actuelle.
Je dois le faire dans un script JS que je peux ajouter au pied de page ou au corps de la page.
J’ai essayé plusieurs solutions, mais je n’arrive pas à obtenir une stabilité suffisante, compte tenu des transitions de page de l’utilisateur.
Je prévois de transmettre le nom de la catégorie résultant sous forme d’événement dans Google Analytics pour compter les visites par catégorie.
Il pourrait exister une méthode pour le faire de manière cohérente sur les pages de sujets et de catégories, mais j’ai obtenu l’ID de catégorie de deux manières différentes… l’une pour les pages de catégories :
<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>
et une méthode similaire pour les pages de sujets :
<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>
Dans l’exemple de la page de catégorie, vous pouvez alternativement utiliser category.name ou category.slug, mais avec le modèle de sujet, seul le category_id est disponible, vous devrez donc faire un peu plus de travail pour obtenir le nom. L’ID pourrait d’ailleurs être une meilleure option car il reste cohérent même si le nom ou l’identifiant de catégorie (slug) change.
J’ai réussi à récupérer l’ID de catégorie pour les pages de catégorie et de sujet,
mais lorsque je vais sur la FAQ ou une autre page, l’ID de catégorie de la page précédente s’affiche toujours.
Comment puis-je l’exclure ?
Voici mon code, il fonctionne, mais je ne connais pas vraiment JS en général.
<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>
Je dois avoir fait une erreur dans les variables ou avoir besoin de récupérer un contrôleur d’un autre type de page.