Definire il template di pagina in wp_insert_post
Come posso impostare quale template di pagina deve utilizzare questa pagina, creata usando wp_insert_post
? Voglio che utilizzi template-blog.php
Questa è la mia funzione attuale:
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 );
}
}

Dalla documentazione di wp_insert_post()
, l'argomento page_template
recita quanto segue:
page_template: Se post_type è 'page', tenterà di impostare il template della pagina. In caso di fallimento, la funzione restituirà un WP_Error o 0, e si fermerà prima che vengano chiamate le azioni finali. Se il post_type non è 'page', il parametro viene ignorato. È possibile impostare il template della pagina per un post type diverso da 'page' chiamando update_post_meta() con la chiave '_wp_page_template'.
Quindi, è necessario inserire la pagina utilizzando wp_insert_post()
e assegnare il template della pagina utilizzando l'argomento 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,
// Assegna il template della pagina
'page_template' => 'template-blog.php'
) );
update_option( 'mytheme_installed', true );
}
}
Oppure, se vuoi impostare un "page template" per un altro post type:
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 );
}
}

Questa risposta è molto vecchia, non sono riuscito a trovare il riferimento per quella citazione, ma ho scoperto che la risposta non era del tutto corretta. Funzionava bene, ma nel caso del tipo di post "page", il template della pagina può essere impostato direttamente usando wp_insert_post()
. Vedi la risposta aggiornata.

Dato che ho dovuto esaminare il core per scoprirlo, penso valga la pena notare anche che il parametro del template è relativo alla cartella del tuo tema. Quindi, nel caso tu mantenga i template in una sottocartella /templates
, dovresti passare templates/template-blog.php
come parametro del template.
