Definir plantilla de página en wp_insert_post
¿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 );
}
}

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

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.

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.
