Definire il template di pagina in wp_insert_post

19 set 2013, 16:51:36
Visualizzazioni: 16.5K
Voti: 9

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 );
}
}
0
Tutte le risposte alla domanda 1
3
17

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 );
    }
}
19 set 2013 17:17:10
Commenti

Puoi collegare quella citazione?

Michael Michael
12 apr 2016 05:37:03

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.

cybmeta cybmeta
12 apr 2016 09:14:40

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.

GigiSan GigiSan
7 dic 2018 13:00:45