How to get a category name with the ID via API

I use Discourse API client for PHP (by @michaeld I guess) and I can’t find how to get a category name/slug with only with an ID.

I need it to display (slug and id) of all our categories and their sub-categories.
But when I get the categories list, the only information about sub-categories is their id.

I asked the same question a long time ago,
https://meta.discourse.org/t/how-to-get-subcategory-names-using-api/29795

6 « J'aime »

Thanks, is it implemented in your php client ?

No, we never implemented that. Should be fairly easy to do, I can take a look later today.

function getCategoryById($categoryId) {
       $datas = $this->_getRequest("/site.json");
       $categories = $datas->apiresult->categories;
       foreach($categories as $categorie) {
         if(($categorie->id) == $categoryId) {
           return $categorie;
         }
       }
2 « J'aime »

You should probably save the data in a global, so you can call the function multiple times in the same PHP script.

3 « J'aime »

I’d rather use /site.json once (to limit the API’s calls). We’ve added the following function to DiscourseApi.php :

function getSite()
    {
        return $this->_getRequest("/site.json");
    }

and then use it to get wanted informations :

  $categories = $discourseApi->getSite()->apiresult->categories;
  foreach ($categories as $category) {
    if (isset($category->parent_category_id)){
      $categories_all[$category->parent_category_id]['subcategory'][$category->id]['id'] = $category->id;
      $categories_all[$category->parent_category_id]['subcategory'][$category->id]['slug'] = $category->slug;
      $categories_all[$category->parent_category_id]['subcategory'][$category->id]['name'] = $category->name;
    } else {
      $categories_all[$category->id]['id'] = $category->id;
      $categories_all[$category->id]['slug'] = $category->slug;
      $categories_all[$category->id]['name'] = $category->name;
    }
  }

(code from congressus/application/config/discourse.structure.php at master · PartiPirate/congressus · GitHub)

(We don’t use the getCategoryById() I’ve suggested before)

site.json semble être la méthode pour obtenir la liste de toutes les catégories. Est-ce mentionné quelque part sur docs.discourse.org ? J’ai parcouru la documentation à la recherche d’un moyen d’obtenir les noms des sous-catégories, mais je n’ai rien trouvé. Ou existe-t-il une meilleure approche ?

Faire une requête API vers site.json est la bonne méthode pour obtenir une liste de catégories incluant les sous-catégories. De plus, si vous souhaitez que les catégories privées soient renvoyées par la requête vers site.json, vous devez effectuer une requête API authentifiée.

Je ne vois aucune référence à site.json dans la documentation. Puisque categories.json ne renvoie pas les sous-catégories, la description de la route categories dans la documentation est incorrecte ; elle indique que la route renvoie toutes les catégories. Je vais corriger cela.

2 « J'aime »