I know how to create pages automatically when a theme is activated, but I need help to figure out how to also programmatically create child pages at the same time.
For example:
- Page 1
- Page 1.1
- Page 1.2
- Page 2
- Page 2.1
- Page 2.2
- Page 2.3
- Page 3
- Page 3.1
- Page 4
- Page 4.1
- Page 4.2
And here is my function for automatic page creation (top level only).
if (isset($_GET['activated']) && is_admin()){
add_action('init', 'create_initial_pages');
}
function create_initial_pages() {
$pages = array(
'page1' => 'Page 1',
'page2' => 'Page 2',
'page3' => 'Page 3',
'page4' => 'Page 4'
);
foreach($pages as $key => $value) {
$id = get_page_by_title($value);
$page = array(
'post_type' => 'page',
'post_title' => $value,
'post_name' => $key,
'post_status' => 'publish',
'post_author' => 1,
'post_parent' => ''
);
if (!isset($id)) wp_insert_post($page);
};
}
Does anyone know how to extend this function to also create child pages (if they don’t already exist) when the theme is activated?
2 Answers
As @Soulseekah said, you can do this with post_parent. I didn’t test with the following code, but it should work
$pages = array(
array(
'name' => 'page1',
'title' => 'Page 1',
'child' => array(
array(
'name' => 'page11',
'title' => 'Page 1.1'
),
array(
'name' => 'page12',
'title' => 'Page 1.2'
)
)
),
array(
'name' => 'page2',
'title' => 'Page 2',
'child' => array(
array(
'name' => 'page21',
'title' => 'Page 2.1'
),
array(
'name' => 'page22',
'title' => 'Page 2.2'
)
)
),
array(
'name' => 'page3',
'title' => 'Page 3',
'child' => array(
array(
'name' => 'page21',
'title' => 'Page 2.1'
),
array(
'name' => 'page22',
'title' => 'Page 2.2'
)
)
),
);
$template = array(
'post_type' => 'page',
'post_status' => 'publish',
'post_author' => 1
);
foreach( $pages as $page ) {
$exists = get_page_by_title( $page['name'] );
if( !$exists ) {
$my_page = array(
'post_name' => $page['name'],
'post_title' => $page['title']
);
$my_page = array_merge( $my_page, $template );
$id = wp_insert_post( $my_page );
//if there is any child page, create them by {$id} as 'post_parent'
if( isset( $page['child'] ) ) {
foreach( $page['child'] as $child ) {
$child_page = array(
'post_name' => $child['name'],
'post_title' => $child['title'],
'post_parent' => $id
);
$child_page = array_merge( $child_page, $template );
$id = wp_insert_post( $child_page );
}
}
}
}