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 Likes

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 Likes

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

3 Likes

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/discourse.structure.php at master · PartiPirate/congressus · GitHub)

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

site.json seems to be the way to get a list of all categories. Is it mentioned somewhere in docs.discourse.org? I was scouring the docs looking for a way to get the names of subcategories and couldn’t find it. Or is there a better way?

Making an API request to site.json is the correct way to get a list of categories that includes subcategories. Also, if you want private categories to be returned by the request to site.json, you need to make an authenticated API request.

I’m not seeing any reference to site.json in the docs. SInce categories.json doesn’t return subcategories, the description of the categories route in the docs isn’t correct, it says that the route returns all categories. I will fix that.

2 Likes