<p>Assuming <code>$parentCategory</code> is an existing <code>CategoryModel</code> (your error says that <code>$parentCategory</code> is not an object):</p>

<pre><code>$childCategory = new CategoryModel();
$childCategory-&gt;groupId = 1;
$childCategory-&gt;newParentId = $parentCategory-&gt;id;
$childCategory-&gt;getContent()-&gt;title = $childCategoryName;

craft()-&gt;categories-&gt;saveCategory($childCategory);
</code></pre>

<p>You can see how Craft does it for it's own categories in <a href="https://github.com/pixelandtonic/Craft-Release/blob/master/app/controllers/CategoriesController.php#L360" rel="nofollow noreferrer">CategoriesController->saveCategory()</a> and <a href="https://craftcms.com/classreference/services/CategoriesService#saveCategory-detail" rel="nofollow noreferrer">CategoriesService->saveCategory()</a>.</p>

CC BY-SA 3.0
2015-06-25T19:09:15.940Z
Works like a charm, thanks Brad! Curious though... why is it necessary to specify both `newParentId` and `setParent`? Couldn't one be extrapolated from the other?
Lindsey D
CC BY-SA 3.0
2015-06-25T19:39:37.360Z
That particular chunk of code could probably use some refactoring.
Brad Bell
CC BY-SA 3.0
2016-11-04T16:54:41.093Z
**Updated:** The relevant Craft code has changed, so the example has been simplified.
Lindsey D
CC BY-SA 3.0
2015-06-25T00:53:35.157Z
2016-11-04T16:53:21.327Z
2016-11-04T16:53:21.327Z
Brad Bell
<p>In a custom plugin, I'm able to easily add a new Category:</p>



<pre class="lang-php prettyprint-override"><code>$category = new CategoryModel();
$category-&gt;groupId = 1;
$category-&gt;getContent()-&gt;title = $categoryName;
craft()-&gt;categories-&gt;saveCategory($category);
</code></pre>

<p>That part works great! But for some reason, I can't figure out how to save a <strong>nested</strong> category.</p>

<p>I'd imagine it's something like this, but it doesn't seem to be working:</p>

<pre class="lang-php prettyprint-override"><code>$childCategory = new CategoryModel();
$childCategory-&gt;groupId = 1;
$childCategory-&gt;level = 2;
$childCategory-&gt;parent = $parentCategory-&gt;id;
$childCategory-&gt;getContent()-&gt;title = $childCategoryName;
craft()-&gt;categories-&gt;saveCategory($childCategory);
</code></pre>

<p>Unfortunately that code is giving me an error:</p>

<blockquote>
  <p><strong>Internal Server Error</strong></p>
  
  <p>Trying to get property of non-object</p>
</blockquote>

<p>And if I drop the <code>-&gt;id</code> portion of this line:</p>

<pre class="lang-php prettyprint-override"><code>$childCategory-&gt;parent = $parentCategory;
</code></pre>

<p>... it will save the category, but it <em>won't be nested</em>.</p>

<p><strong>What am I doing wrong?</strong></p>

<plugin-development><categories>
Create nested Category via PHP
# Create nested Category via PHP

(Asked by: username_0 on 2015-06-25)

In a custom plugin, I'm able to easily add a new Category:
$category = new CategoryModel();
$category->groupId = 1;
$category->getContent()->title = $categoryName;
craft()->categories->saveCategory($category);

That part works great! But for some reason, I can't figure out how to save a nested category.
I'd imagine it's something like this, but it doesn't seem to be working:
$childCategory = new CategoryModel();
$childCategory->groupId = 1;
$childCategory->level = 2;
$childCategory->parent = $parentCategory->id;
$childCategory->getContent()->title = $childCategoryName;
craft()->categories->saveCategory($childCategory);

Unfortunately that code is giving me an error:

Internal Server Error
Trying to get property of non-object

And if I drop the ->id portion of this line:
$childCategory->parent = $parentCategory;

... it will save the category, but it won't be nested.
What am I doing wrong?

**Tags:** plugin-development, categories

---

## 1 answers

### Answer by username_1 on 2015-06-25. Score: 5 | Accepted answer

Assuming $parentCategory is an existing CategoryModel (your error says that $parentCategory is not an object):
$childCategory = new CategoryModel();
$childCategory->groupId = 1;
$childCategory->newParentId = $parentCategory->id;
$childCategory->getContent()->title = $childCategoryName;

craft()->categories->saveCategory($childCategory);

You can see how Craft does it for it's own categories in CategoriesController->saveCategory() and CategoriesService->saveCategory().

> **Comments:**
> **username_0**: Works like a charm, thanks Brad! Curious though... why is it necessary to specify both `newParentId` and `setParent`? Couldn't one be extrapolated from the other?  
> **username_1**: That particular chunk of code could probably use some refactoring.  
> **username_0**: **Updated:** The relevant Craft code has changed, so the example has been simplified.  

---

