On theme activation the following code doesn't create my menu with the 'New Page' item, the menu is created and the location is assigned to 'submenu' but no menu item of my newly created page?

What am I missing?

if (isset($_GET['activated']) && is_admin()){
    $new_page_title = 'New Page';
    $new_page_slug = '/new-page/';
    $new_page_content = 'This is the page content';
    $new_page_template = 'page-job-list.php'; //ex. template-custom.php. Leave blank if you don't want a custom page template.
    //don't change the code bellow, unless you know what you're doing
    $page_check = get_page_by_title($new_page_title);
    $new_page = array(
            'post_type' => 'page',
            'post_title' => $new_page_title,
            'post_content' => $new_page_content,
        'post_status' => 'publish',
        'post_author' => 1,
        $new_page_id = wp_insert_post($new_page);
                update_post_meta($new_page_id, '_wp_page_template', $new_page_template);

// Check if the menu exists
$menu_name = 'AnotherMenu';
$menu_exists = wp_get_nav_menu_object( $menu_name );

// If it doesn't exist, let's create it.
if( !$menu_exists){
    $menu_id = wp_create_nav_menu($menu_name);

    wp_update_nav_menu_item($menu_id, $new_page_id, array(
        'menu-item-title' =>  __($new_page_title),
        'menu-item-url' => home_url( $new_page_slug ), 
        'menu-item-status' => 'publish'));

$menulocation = 'submenu';

if(!has_nav_menu($menulocation) ){
    $locations = get_theme_mod('nav_menu_locations');
    $locations[$menulocation] = $menu_id;  //$foo is term_id of menu
    set_theme_mod('nav_menu_locations', $locations);

The value of $menu_id is not initialized if the menu already exists. So, if on theme activation, $menu_exists is true, $menu_id will never be set to a value and this line should produce a PHP warning:

$locations[$menulocation] = $menu_id;

You could try adding it like this:

if ( $menu_exists ) {
    $menu_id = $menu_exists->term_id;

} else {
    // Menu doesn't exist, let's create it.
    $menu_id = wp_create_nav_menu( $menu_name );

    wp_update_nav_menu_item( $menu_id, $new_page_id, array(
        'menu-item-title' =>  __( $new_page_title ),
        'menu-item-url' => home_url( $new_page_slug ),
        'menu-item-status' => 'publish' ) );

That may not fix your problem. I couldn't test some things without knowing more about the theme settings.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.