web-dev-qa-db-fra.com

Comment créer par programme des pages "enfants" sur l'activation du thème?

Je sais comment créer des pages automatiquement lorsqu'un thème est activé, mais j'ai besoin d'aide pour comprendre comment créer également des pages enfants par programme en même temps.

Par exemple:

- Page 1
  - Page 1.1
  - Page 1.2
- Page 2
  - Page 2.1
  - Page 2.2
  - Page 2.3
- Page 3
  - Page 3.1
- Page 4
  - Page 4.1
  - Page 4.2

Et voici ma fonction pour la création automatique de pages (niveau supérieur uniquement).

if (isset($_GET['activated']) && is_admin()){
    add_action('init', 'create_initial_pages');
}

function create_initial_pages() {
    $pages = array(
        'page1' => 'Page 1',
        'page2' => 'Page 2',
        'page3' => 'Page 3',
        'page4' => 'Page 4'
    );
    foreach($pages as $key => $value) {
        $id = get_page_by_title($value);
        $page = array(
            'post_type'   => 'page',
            'post_title'  => $value,
            'post_name'   => $key,
            'post_status' => 'publish',
            'post_author' => 1,
            'post_parent' => ''
        );
        if (!isset($id)) wp_insert_post($page);
    };
}

Est-ce que quelqu'un sait comment étendre cette fonction pour créer également des pages enfants (si elles n'existent pas déjà) lorsque le thème est activé?

3
Paul

L'exemple de @Tareq était très utile, mais au lieu de créer plusieurs pages enfants pour la page parent, chaque page enfant deviendrait une page sous-parent.

Page 1
- Page 1.1
  -- Page 1.2
     --- Page 1.3
Page 2
- Page 2.1
  -- Page 2.2

etc.

Voici la fonction corrigée/améliorée (je suis sûr que cela peut encore être amélioré car les vérifications de pages ne sont pas aussi minutieuses):

function create_initial_pages() {
    $pages = array(
        array(
            'name'  => 'page1',
            'title' => 'Page 1',
            'child' => array(
                'page1-1' => 'Page 1.1',
                'page1-2' => 'Page 1.2',
                'page1-3' => 'Page 1.3',
                'page1-4' => 'Page 1.4'
            )
        ),
        array(
            'name'  => 'page2',
            'title' => 'Page 2',
            'child' => array(
                'page2-1' => 'Page 2.1',
                'page2-2' => 'Page 2.2',
                'page2-3' => 'Page 2.3'
            )
        )
    );

    $template = array(
        'post_type'   => 'page',
        'post_status' => 'publish',
        'post_author' => 1
    );

    foreach( $pages as $page ) {
        $exists = get_page_by_title( $page['title'] );
        $my_page = array(
            'post_name'  => $page['name'],
            'post_title' => $page['title']
        );
        $my_page = array_merge( $my_page, $template );

        $id = ( $exists ? $exists->ID : wp_insert_post( $my_page ) );

        if( isset( $page['child'] ) ) {
            foreach( $page['child'] as $key => $value ) {
                $child_id = get_page_by_title( $value );
                $child_page = array(
                    'post_name'   => $key,
                    'post_title'  => $value,
                    'post_parent' => $id
                );
                $child_page = array_merge( $child_page, $template );
                if( !isset( $child_id ) ) wp_insert_post( $child_page );
            }
        }
    }
}
2
Paul

Comme @Soulseekah l'a dit, vous pouvez le faire avec post_parent. Je n'ai pas testé avec le code suivant, mais cela devrait fonctionner

$pages = array( 
    array(
        'name' => 'page1',
        'title' => 'Page 1',
        'child' => array(
            array(
                'name' => 'page11',
                'title' => 'Page 1.1'
            ),
            array(
                'name' => 'page12',
                'title' => 'Page 1.2'
            )
        )
    ),
    array(
        'name' => 'page2',
        'title' => 'Page 2',
        'child' => array(
            array(
                'name' => 'page21',
                'title' => 'Page 2.1'
            ),
            array(
                'name' => 'page22',
                'title' => 'Page 2.2'
            )
        )
    ),
    array(
        'name' => 'page3',
        'title' => 'Page 3',
        'child' => array(
            array(
                'name' => 'page21',
                'title' => 'Page 2.1'
            ),
            array(
                'name' => 'page22',
                'title' => 'Page 2.2'
            )
        )
    ),
);

$template = array(
    'post_type' => 'page',
    'post_status' => 'publish',
    'post_author' => 1
);

foreach( $pages as $page ) {
    $exists = get_page_by_title( $page['name'] );

    if( !$exists ) {
        $my_page = array(
            'post_name' => $page['name'],
            'post_title' => $page['title']
        );
        $my_page = array_merge( $my_page, $template );

        $id = wp_insert_post( $my_page );

        //if there is any child page, create them by {$id} as 'post_parent'
        if( isset( $page['child'] ) ) {
            foreach( $page['child'] as $child ) {
                $child_page = array(
                    'post_name' => $child['name'],
                    'post_title' => $child['title'],
                    'post_parent' => $id
                );
                $child_page = array_merge( $child_page, $template );
                $id = wp_insert_post( $child_page );
            }
        }
    }
}
3
Tareq