Как задать шаблон страницы при использовании wp_insert_post в WordPress
Как я могу указать, какой шаблон страницы будет использоваться для страницы, созданной с помощью wp_insert_post
? Мне нужно, чтобы она использовала template-blog.php
Вот моя текущая функция:
add_action( 'admin_init', 'mytheme_admin_init' );
function mytheme_admin_init() {
if ( get_option( 'mytheme_installed' ) != true ) {
$new_page = array(
'slug' => 'blog',
'title' => 'Блог',
'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 );
}
}

Из документации wp_insert_post()
, аргумент page_template
описывается следующим образом:
page_template: Если post_type является 'page', будет предпринята попытка установить шаблон страницы. В случае неудачи функция вернет либо объект WP_Error, либо 0, и остановится до вызова финальных действий. Если post_type не является 'page', параметр игнорируется. Вы можете установить шаблон страницы для не-страницы, вызвав update_post_meta() с ключом '_wp_page_template'.
Таким образом, вам нужно вставить страницу с помощью wp_insert_post()
и назначить шаблон страницы, используя аргумент 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' => 'Блог',
'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,
// Назначение шаблона страницы
'page_template' => 'template-blog.php'
) );
update_option( 'mytheme_installed', true );
}
}
Или, если вы хотите установить "шаблон страницы" для другого типа записи:
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' => 'Блог',
'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 );
}
}

Этот ответ очень старый, я не смог найти источник цитаты, но обнаружил, что ответ был не совсем верным. Он работал, но в случае типа записи "страница", шаблон страницы можно установить напрямую с помощью wp_insert_post()
. Смотрите обновленный ответ.

Поскольку мне пришлось отлаживать ядро, чтобы это выяснить, думаю, стоит также отметить, что параметр template указывается относительно папки вашей темы. Поэтому если вы храните шаблоны в подкаталоге /templates
, следует передавать templates/template-blog.php
в качестве параметра template.
