How to create pages and a navigation menu automatically?
Sometimes, to quickly create a prototype, I install a WordPress with WP-CLI, an homemade template, and create the navigation (using this script, for example).
To go a step further, below is a script that allows you to create pages (with nesting on up to 2 levels) and the corresponding navigation menu.
Add this script to your functions.php file:
<?php /* * List of post or page to create dynamically * * Structure must be in this format: * order_id => ["title","template.php" (only if post_type = page), "post type"] * * 1st level elements must be hundreds, sub-levels must be in the hundreds (e.g. 110, 120, ...) * */ $menu_name = 'Menu Principal'; $items = [ 100 => ["Accueil"], 200 => ["Chambres"], 210 => ["Supérieure Nord"], 220 => ["Supérieure Sud"], 230 => ["Supérieure Deluxe"], 240 => ["Junior Suite Nord"], 250 => ["Junior Suite Sud"], 260 => ["Suites"], 300 => ["SPA"], 310 => ["Le Wellness"], 320 => ["Les Soins"], 330 => ["Les Produits"], 340 => ["Cures et Programmes"], 400 => ["Offres"], 500 => ["Activités"], 600 => ["Contact"], ]; add_action('after_setup_theme', 'wpster_create_pages_and_menu'); function wpster_create_pages_and_menu() { global $items, $menu_name; // create menu if not exists $menu_exists = wp_get_nav_menu_object($menu_name); if (!$menu_exists) $menu_id = wp_create_nav_menu($menu_name); else $menu_id = $menu_exists->term_id; foreach ($items as $key => $value) { if($key % 100 == 0): $parent = $key; $title = $items[$key][0]; $parent_slug = sanitize_title(trim($title)); $parent_id = ''; $parent_nav_id = ''; else: $my_post = get_page_by_path($parent_slug, '', 'page'); if(isset($my_post)) $parent_id = $my_post->ID; else $parent_id = ''; endif; $menu_order = $key; $title = $items[$key][0]; if(isset($items[$key][1])) $template = $items[$key][1]; else $template = 'flex.php'; if(isset($items[$key][2])) $type = $items[$key][2]; else $type = 'page'; $post_id = wpster_create_page("$title", $menu_order, "$type", "$template", $parent_id); $nav_id = wpster_add_page_to_navigation($menu_id, $post_id, "$title", $menu_order, "$type", $parent_nav_id); if($parent_id=='') $parent_nav_id = $nav_id; } } /** * Function to create a page if not exists * * @return post ID */ function wpster_create_page($title, $menu_order, $type, $template, $parent_id=NULL) { $slug = sanitize_title(trim($title)); $new_page = array( 'post_type' => $type, 'post_title' => $title, 'post_author' => get_current_user_id(), 'post_name' => $slug, 'post_parent' => $parent_id, 'menu_order' => $menu_order, 'page_template' => $template, 'post_status' => 'publish', 'comment_status' => 'close', 'ping_status' => 'close', ); $post = wpster_get_page_by_slug( $slug, OBJECT, $type); if (!$post) return wp_insert_post($new_page); else return $post->ID; } /** * Function to add page to navigation menu if not exists * * @return post ID */ function wpster_add_page_to_navigation($menu_id, $post_id, $title, $menu_order, $type, $parent_nav_id='') { if(cms_is_in_menu($menu_id, $post_id)==false): return wp_update_nav_menu_item($menu_id, 0, array( 'menu-item-title' => $title, 'menu-item-object-id' => $post_id, 'menu-item-object' => $type, 'menu-item-status' => 'publish', 'menu-item-type' => 'post_type', 'menu-item-parent-id' => $parent_nav_id, 'menu-item-position' => $menu_order, )); endif; } /** * Function to get page_id by slug * * @return post ID */ function wpster_get_page_by_slug($page_slug, $output = OBJECT, $post_type = 'page' ) { global $wpdb; $page = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_name = %s AND post_type= %s AND post_status = 'publish'", $page_slug, $post_type ) ); if ( $page ) return get_post($page, $output); return null; } /** * Function to check if a page is already in navigation menu * * @param $menu menu name, id, or slug * @param $object_id int post object id of page * @return bool true if object is in menu */ function cms_is_in_menu( $menu = null, $object_id = null ) { $menu_object = wp_get_nav_menu_items( esc_attr( $menu ) ); if( ! $menu_object ) return false; $menu_items = wp_list_pluck( $menu_object, 'object_id' ); if( !$object_id ) { global $post; $object_id = get_queried_object_id(); } return in_array( (int) $object_id, $menu_items ); } ?>