Definir plantilla de página en wp_insert_post

19 sept 2013, 16:51:36
Vistas: 16.5K
Votos: 9

¿Cómo puedo establecer qué plantilla de página usará esta página creada con wp_insert_post? Quiero que use template-blog.php

Esta es mi función actual:

add_action( 'admin_init', 'mytheme_admin_init' );
function mytheme_admin_init() {
if ( get_option( 'mytheme_installed' ) != true ) {
    $new_page = array(
        'slug' => 'blog',
        'title' => 'Blog',
        'content' => ""
    );
    $new_page_id = wp_insert_post( array(
        'post_title' => $new_page['title'],
        'post_type'     => 'page',
        'post_name'  => $new_page['slug'],
        'comment_status' => 'closed',
        'ping_status' => 'closed',
        'post_content' => $new_page['content'],
        'post_status' => 'publish',
        'post_author' => 1,
        'menu_order' => 0
    ));

    update_option( 'mytheme_installed', true );
}
}
0
Todas las respuestas a la pregunta 1
3
17

De la documentación de wp_insert_post(), el argumento page_template se lee de la siguiente manera:

page_template: Si el post_type es 'page', intentará establecer la plantilla de página. En caso de fallo, la función devolverá un WP_Error o 0, y se detendrá antes de que se llamen las acciones finales. Si el post_type no es 'page', el parámetro se ignora. Puedes establecer la plantilla de página para un no-page llamando a update_post_meta() con una clave de '_wp_page_template'.

Por lo tanto, necesitas insertar la página usando wp_insert_post() y asignar la plantilla de página usando el argumento page_template:

add_action( 'admin_init', 'mytheme_admin_init' );
function mytheme_admin_init() {
    if ( ! get_option( 'mytheme_installed' ) ) {
        $new_page_id = wp_insert_post( array(
            'post_title'     => 'Blog',
            'post_type'      => 'page',
            'post_name'      => 'blog',
            'comment_status' => 'closed',
            'ping_status'    => 'closed',
            'post_content'   => '',
            'post_status'    => 'publish',
            'post_author'    => get_user_by( 'id', 1 )->user_id,
            'menu_order'     => 0,
            // Asignar plantilla de página
            'page_template'  => 'template-blog.php'
        ) );

        update_option( 'mytheme_installed', true );
    }
}

O, si deseas establecer una "plantilla de página" para otro tipo de entrada:

add_action( 'admin_init', 'mytheme_admin_init' );
function mytheme_admin_init() {
    if ( ! get_option( 'mytheme_installed' ) ) {
        $new_page_id = wp_insert_post( array(
            'post_title'     => 'Blog',
            'post_type'      => 'my_custom_post_type',
            'post_name'      => 'blog',
            'comment_status' => 'closed',
            'ping_status'    => 'closed',
            'post_content'   => '',
            'post_status'    => 'publish',
            'post_author'    => get_user_by( 'id', 1 )->user_id,
            'menu_order'     => 0
        ) );

        if ( $new_page_id && ! is_wp_error( $new_page_id ) ){
            update_post_meta( $new_page_id, '_wp_page_template', 'template-blog.php' );
        }

        update_option( 'mytheme_installed', true );
    }
}
19 sept 2013 17:17:10
Comentarios

¿Puedes enlazar a esa cita?

Michael Michael
12 abr 2016 05:37:03

Esta respuesta es muy antigua, no pude encontrar la referencia de esa cita, pero descubrí que la respuesta no era completamente correcta. Funcionaba bien pero en el caso del tipo de entrada 'page', la plantilla de página puede establecerse directamente usando wp_insert_post(). Ver respuesta actualizada.

cybmeta cybmeta
12 abr 2016 09:14:40

Como tuve que depurar el núcleo para descubrirlo, creo que también vale la pena mencionar que el parámetro de plantilla es relativo a la carpeta de tu tema. Así que en caso de que guardes plantillas en un subdirectorio /templates, deberías pasar templates/template-blog.php como parámetro de plantilla.

GigiSan GigiSan
7 dic 2018 13:00:45