How to bring back Post Categories in P2

- by

We’re all excited about the new features in Automattic’s P2 Theme v1.4.0 – however many of us have setup custom tweaks around Post Categories. In the latest version these have been replaced with Post Formats.

Post Formats are great, but they are limited to values defined in the WordPress core. If you wanted to create a new post menu like “critical” or “alarm” this wouldn’t work. We could use Custom Post Types to add to those formats, however it’s way too big an operation for I wanted to achieve: which is bringing back the “posting into categories” feature we’ve come to love from the previous version.

In this article I’ll show you how to back-port categories so posts will appear as they did in P2 v1.3.3 while retaining all functions of the latest update.

I’ve explained how to tweak labels for the post menu in an earlier post – instructions for adding and amending labels are still the same. Here we’ll delve right in to adding a few statements to the P2 code.

Let’s focus our attention on /inc/ajax.php file which contains our function that creates a new post (line 239 in P2 version 1.4.2). We’ll leave everything intact here. Have a look at this array first:

$post_id = wp_insert_post( array(
	'post_author'   => $user_id,
	'post_title'    => $post_title,
	'post_content'  => $post_content,
	'post_type'     => 'post',
	'tags_input'    => $tags,
	'post_status'   => 'publish'
) );

What’s missing here is a category definition so let’s add one to the bottom:

$post_id = wp_insert_post( array(
	'post_author'   => $user_id,
	'post_title'    => $post_title,
	'post_content'  => $post_content,
	'post_type'     => 'post',
	'tags_input'    => $tags,
	'post_status'   => 'publish',
	// bringing back P2 Categories
	'post_category' => array( $post_cat -> cat_ID )
	// end of mod
) );

This is pretty much what P2 v1.3.3 did. Just above this block we need to grab the post format and set it as our category, then convert the category slug to a numeric value so that we can use it in this array. Only takes two lines of code (one if you make it more complex) – put them just above the array block:

	// define $post_cat
        $post_cat = $_POST['post_format'];
        // and turn it into the category ID
        $post_cat = get_category_by_slug( $post_cat );

Now P2 will look at the Post Format (say ‘status’) and add your post to a category with the same name.

Note: If your category does not exist then the post will appear in your default category  as defined under Settings – Writing. So if you’re posting in “Quote” then you need to setup a category by that name manually.

Here are some screenshots to illustrate the benefits:

I’ve added my own “Testing” menu item on the front page
In the backend all posts are now in their respective categories again – as well as retaining their post format properties

This tweak will give you everything the new and improved P2 has to offer while still giving you access to all your category amendments and queries.


Full Project Code

UPDATE March 2013:

Somehow my code got screwed up over time in this post. I’ve corrected it so that special characters are displayed correctly. But just in case they are not, here’s a gist of the complete block you need to replace:

I have also created a full working version of this theme with tweaks on GitHub. Feel free to pull and fork as you please:


If you enjoy my content, please consider supporting me on Ko-fi. In return you can browse this whole site without any pesky ads! More details here.

27 thoughts on “How to bring back Post Categories in P2”

  1. Hi Chris,

    the answer lies in a file called post-form.php. This generates the buttons above the post box and sets the post type for each button. Look for an unordered list towards the top of the file and change them to your desired format.

    One thing about P2 child themes: they don’t seem to work properly, I’m not sure why. I’ve noticed that some modifications you make in your child theme don’t make it into the final output.

  2. Hi Jay,

    My oversight: I accomplished posting to a special post_type by adding a hidden post_type input field.

    Now if only I could get the p2_load_entry to work correctly. 🙂

Leave a Comment!

This site uses Akismet to reduce spam. Learn how your comment data is processed.