I have an unusual situation where I need to make the built-in post type ‘page’ non-hierarchical.

I printed the post type object with var_dump(get_post_type_object('page')); die; and I got this:

object(stdClass)#164 (26) {
  ["labels"]=>
  ...
  }
  ["description"]=>
  string(0) ""
  ["publicly_queryable"]=>
  bool(false)
  ["exclude_from_search"]=>
  bool(false)
  ["capability_type"]=>
  string(4) "page"
  ["map_meta_cap"]=>
  bool(true)
  ["_builtin"]=>
  bool(true)
  ["_edit_link"]=>
  string(16) "post.php?post=%d"
  ["hierarchical"]=>
  bool(true)
  ....
}

How might I go about modifying the post-type object so that ["hierarchical"]=>bool(false)?

3 Answers
3

This is a pretty late answer, but I was looking to do something similar and figured it out. I wanted to get nav_menu_items into an RSS feed, which required changing the built in nav_menu_item post type property publicly_queryable.

Anyway, it was actually pretty simple, here’s a generic function to do it:

function change_wp_object() {
  $object = get_post_type_object('post_type');
  $object->property = true;
}
add_action('init','change_wp_object');

And that’s it. I’ve got it in a plugin. If you want to see the list of available properties to change, throw in

echo '<pre>'.print_r($object, 1).'</pre>';

to get a nicely formatted output of all the properties.

In your case you’d use

$object-> hierarchical = false;

Hope that helps someone!

Leave a Reply

Your email address will not be published. Required fields are marked *