A way to automatically install pages on theme install?

I’m trying to build a theme which would require specific pages to be included. Is there a way to automatically create pages and assign them to their page templates when a theme is installed?

Related posts

Leave a Reply

4 comments

  1. I got similiar situation where I needed to add page on theme activation and set it as homepage automatically.

    Here’s how I did it:

    add_action('after_setup_theme', 'mytheme_setup');
    
    function mytheme_setup(){
    
     if(get_option('page_on_front')=='0' && get_option('show_on_front')=='posts'){
            // Create homepage
            $homepage = array(
                'post_type'    => 'page',
                'post_title'    => 'Home',
                'post_content'  => '',
                'post_status'   => 'publish',
                'post_author'   => 1
            ); 
            // Insert the post into the database
            $homepage_id =  wp_insert_post( $homepage );
            // set this page as homepage
            update_option('show_on_front', 'page');
            update_option('page_on_front', $homepage_id);
        }
    
    }
    

    Hope this helps someone.

    Update:

    add_action('after_setup_theme', 'mytheme_setup');
    
    function mytheme_setup(){
    
     if(get_option('page_on_front')=='0' && get_option('show_on_front')=='posts'){
            // Create homepage
            $homepage = array(
                'post_type'    => 'page',
                'post_title'    => 'Home',
                'post_content'  => '',
                'post_status'   => 'publish',
                'post_author'   => 1
            ); 
            // Insert the post into the database
            $homepage_id =  wp_insert_post( $homepage );
            //set the page template 
            //assuming you have defined template on your-template-filename.php
            update_post_meta($homepage_id, '_wp_page_template', 'your-template-filename.php');
        }
    
    }
    

    Thanks Maruti Mohanty.

  2. This is bad practice. Themes are for presentation, they are visual, they shouldn’t be dictating actual content. If they do, then you’re doing it wrong and your code would be better off as a plugin.

    However, should your theme have an ‘intended’ content arrangement, you should not auto-create the pages/content, you should not meddle with the users content at all, you could be breaking other things.

    Instead, allow the user to select which pages should be used, in the same way settings allows you to pick a static page instead of latest posts, and how plugins like Woocommerce or Jigoshop let you choose which page is the checkout page etc ( those are plugins, it’s okay for them to create pages that way ).

    Eitherway this indicates a fundamental flaw in your approach to building your theme ( or you’re building something for a client, and have decided to make it easy for them to install, creating more work for you, whereas you would be better off offering to install it yourself for a fee, which would be more profitable ).

    Should you be foolish enough to actually attempt it anyway…

    Refer to http://codex.wordpress.org/Function_Reference/wp_insert_post

    But, you will need to check each ‘init’ to see if the pages exist. If they don’t create them, and update an option somewhere so that you remember they’ve been created and not to check the next time around, else you’ll end up with more pages created on every page load.

  3. Using the code in this answer and a wp_insert_post I found in this theme.

    wp_register_theme_activation_hook('twentyten', 'wpse_25885_theme_activate');
    wp_register_theme_deactivation_hook('twentyten', 'wpse_25885_theme_deactivate');
    
    /**
     *
     * @desc registers a theme activation hook
     * @param string $code : Code of the theme. This can be the base folder of your theme. Eg if your theme is in folder 'mytheme' then code will be 'mytheme'
     * @param callback $function : Function to call when theme gets activated.
     */
    function wp_register_theme_activation_hook($code, $function) {
        $optionKey="theme_is_activated_" . $code;
        if(!get_option($optionKey)) {
            call_user_func($function);
            update_option($optionKey , 1);
        }
    }
    
    /**
     * @desc registers deactivation hook
     * @param string $code : Code of the theme. This must match the value you provided in wp_register_theme_activation_hook function as $code
     * @param callback $function : Function to call when theme gets deactivated.
     */
    function wp_register_theme_deactivation_hook($code, $function)
    {
        // store function in code specific global
        $GLOBALS["wp_register_theme_deactivation_hook_function" . $code]=$function;
    
        // create a runtime function which will delete the option set while activation of this theme and will call deactivation function provided in $function
        $fn=create_function('$theme', ' call_user_func($GLOBALS["wp_register_theme_deactivation_hook_function' . $code . '"]); delete_option("theme_is_activated_' . $code. '");');
    
        // add above created function to switch_theme action hook. This hook gets called when admin changes the theme.
        // Due to wordpress core implementation this hook can only be received by currently active theme (which is going to be deactivated as admin has chosen another one.
        // Your theme can perceive this hook as a deactivation hook.)
        add_action("switch_theme", $fn);
    }
    
    function wpse_25885_theme_activate()
    {
        $default_pages = array(
            array(
                'title' => 'Home',
                'content' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum consequat, orci ac laoreet cursus, dolor sem luctus lorem, eget consequat magna felis a magna. Aliquam scelerisque condimentum ante, eget facilisis tortor lobortis in. In interdum venenatis justo eget consequat. Morbi commodo rhoncus mi nec pharetra. Aliquam erat volutpat. Mauris non lorem eu dolor hendrerit dapibus. Mauris mollis nisl quis sapien posuere consectetur. Nullam in sapien at nisi ornare bibendum at ut lectus. Pellentesque ut magna mauris. Nam viverra suscipit ligula, sed accumsan enim placerat nec. Cras vitae metus vel dolor ultrices sagittis.'
                ),
            array(
                'title' => 'Contact',
                'content' => 'Duis venenatis augue sed risus laoreet congue ac ac leo. Donec fermentum accumsan libero sit amet iaculis. Duis tristique dictum enim, ac fringilla risus bibendum in. Nunc ornare, quam sit amet ultricies gravida, tortor mi malesuada urna, quis commodo dui nibh in lacus. Nunc vel tortor mi. Pellentesque vel urna a arcu adipiscing imperdiet vitae sit amet neque. Integer eu lectus et nunc dictum sagittis. Curabitur commodo vulputate fringilla. Sed eleifend, arcu convallis adipiscing congue, dui turpis commodo magna, et vehicula sapien turpis sit amet nisi.'
                )
        );
        $existing_pages = get_pages();
        $existing_titles = array();
    
        foreach ($existing_pages as $page) 
        {
            $existing_titles[] = $page->post_title;
        }
    
        foreach ($default_pages as $new_page) 
        {
            if( !in_array( $new_page['title'], $existing_titles ) )
            {
                // create post object
                $add_default_pages = array(
                    'post_title' => $new_page['title'],
                    'post_content' => $new_page['content'],
                    'post_status' => 'publish',
                    'post_type' => 'page'
                  );
    
                // insert the post into the database
                $result = wp_insert_post($add_default_pages);   
            }
        }
    }
    
    function wpse_25885_theme_deactivate() 
    {
       // code to execute on theme deactivation
    }