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)
?
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)
?
- As a first reaction I really have no idea what you want to accomplish, which makes me think this question could be better if you give some examples and explain why you would want to change the post type object - maybe there is a better way to do what you want? – miahelf Commented Apr 17, 2012 at 5:38
- I have an existing site wherein there are 300+ pages. The content editors wish to disable the ability to create child pages for two reasons: 1) The content of pages is almost never related, and 2) Some less experienced editors have been creating child pages which are not displayed in the theme, causing that content to be "lost". The only other option I explored was to simply hide the "page parent" dropdowns in the quickedit view and the edit screen, but that seems kinda hacky as it involves css rather than filters. – Niels Commented Apr 19, 2012 at 1:11
3 Answers
Reset to default 3This 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!
What about:
function wp1482371_page_post_type_args( $args, $post_type ) {
if ( $post_type == "pages" ) {
$args['hierarchical'] = false
);
}
return $args;
}
add_filter( 'register_post_type_args', 'wp1482371_page_post_type_args', 20, 2 );
As far as I can tell, there is no (good) way to change the core post types. The alternative of course is to make your own custom post type. If you have a bunch of posts that are the core post type of page, you could run a MySQL query to convert them all at once to the new post type, once created, if you need to. Or, you could possibly change the way your theme displays a list of pages.
To make a new post type that is not hierarchical:
add_action( 'init', 'create_post_type' );
function create_post_type() {
register_post_type( 'nonhierarchical_page',
array(
'labels' => array(
'name' => __( 'NHPages' ),
'singular_name' => __( 'NHPage' )
),
'public' => true,
'hierarchical' => false
)
);
}