Как задать шаблон страницы при использовании wp_insert_post в WordPress

19 сент. 2013 г., 16:51:36
Просмотры: 16.5K
Голосов: 9

Как я могу указать, какой шаблон страницы будет использоваться для страницы, созданной с помощью 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 );
}
}
0
Все ответы на вопрос 1
3
17

Из документации 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 );
    }
}
19 сент. 2013 г. 17:17:10
Комментарии

Можете ли вы привести ссылку на эту цитату?

Michael Michael
12 апр. 2016 г. 05:37:03

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

cybmeta cybmeta
12 апр. 2016 г. 09:14:40

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

GigiSan GigiSan
7 дек. 2018 г. 13:00:45