¿Una forma de instalar automáticamente páginas en la instalación del tema?

8

Estoy tratando de crear un tema que requiera la inclusión de páginas específicas. ¿Hay alguna manera de crear páginas automáticamente y asignarlas a sus plantillas de página cuando se instala un tema?

JonnyPlow
fuente
1
Estoy bastante seguro de que la misma pregunta ya se ha hecho aquí. Solo busca un poco más.
Steven
No pude encontrar nada, por eso pregunto. Si conoces una publicación, compártela.
JonnyPlow

Respuestas:

3

Tuve una situación similar en la que necesitaba agregar una página en la activación del tema y configurarla como página de inicio automáticamente.

Así es como lo hice:

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);
    }

}

Espero que esto ayude a alguien.

Actualizar:

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');
    }

}

Gracias Maruti Mohanty .

Poudel Dharma
fuente
Si bien ha mencionado los detalles de la solución, pero esto no es algo que el usuario esté buscando. Pero si también puede agregar cómo puede agregar / especificar una plantilla de página a la nueva publicación, eso podría darle al usuario una idea para trabajar
Maruti Mohanty
1
Editado Y gracias por señalarme en la dirección correcta.
Dharma Poudel
1

Esta es una mala práctica. Los temas son para presentación, son visuales, no deberían dictar contenido real. Si lo hacen, entonces lo estás haciendo mal y tu código sería mejor como un complemento.

Sin embargo, si su tema tiene una disposición de contenido 'prevista', no debe crear automáticamente las páginas / contenido, no debe entrometerse en absoluto con el contenido de los usuarios, podría estar rompiendo otras cosas.

En su lugar, permita que el usuario seleccione qué páginas deben usarse, de la misma manera que la configuración le permite elegir una página estática en lugar de las últimas publicaciones, y cómo los complementos como Woocommerce o Jigoshop le permiten elegir qué página es la página de pago, etc. plugins, está bien que creen páginas de esa manera).

De todos modos, esto indica una falla fundamental en su enfoque para crear su tema (o está creando algo para un cliente, y ha decidido facilitarle la instalación, creando más trabajo para usted, mientras que sería mejor ofrecerle instálelo usted mismo por una tarifa, que sería más rentable).

Si eres lo suficientemente tonto como para intentarlo de todos modos ...

Consulte http://codex.wordpress.org/Function_Reference/wp_insert_post

Pero, deberá verificar cada 'init' para ver si las páginas existen. Si no los crean y actualizan una opción en alguna parte para que recuerde que se crearon y no verificar la próxima vez, de lo contrario terminará con más páginas creadas en cada carga de página.

Tom J Nowell
fuente
0

Usando el código en esta respuesta y una wp_insert_postque encontré en este tema .

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
}
brasofilo
fuente