Esiste un file template predefinito per le pagine figlie / sottopagine?

15 giu 2012, 05:47:55
Visualizzazioni: 25K
Voti: 6

Questa sembra una domanda molto semplice. Sto cercando qualcosa come sub-page.php o page-child.php dove posso fare alcune cose diverse nelle pagine figlie del mio tema.

Sono abbastanza diverse nel design e nel contenuto tanto che devo utilizzare molto codice PHP o la classe CSS .page-child per fare tutto il lavoro pesante. Sto cercando un metodo più semplice.

Una precisazione - vorrei che questo accadesse automaticamente così da non dover dire al cliente "assicurati di selezionare sempre il template 'sottopagina' quando crei una sottopagina!" il che è precario..

0
Tutte le risposte alla domanda 4
2
16

In realtà è molto semplice, aggiungi il seguente codice al tuo functions.php

add_filter(
    'page_template',
    function ($template) {
        global $post;

        if ($post->post_parent) {

            // ottieni la pagina genitore di livello superiore
            $parent = get_post(
               reset(array_reverse(get_post_ancestors($post->ID)))
            );

            // oppure ...
            // quando hai bisogno del post genitore più vicino
            // $parent = get_post($post->post_parent);

            $child_template = locate_template(
                [
                    $parent->post_name . '/page-' . $post->post_name . '.php',
                    $parent->post_name . '/page-' . $post->ID . '.php',
                    $parent->post_name . '/page.php',
                ]
            );

            if ($child_template) return $child_template;
        }
        return $template;
    }
);

Quindi puoi preparare i template con i seguenti pattern:

  • [parent-page-slug]/page.php
  • [parent-page-slug]/page-[child-page-slug].php
  • [parent-page-slug]/page-[child-post-id].php
25 feb 2016 11:05:55
Commenti

Questa è una risposta estremamente sottovalutata, è molto più versatile della risposta accettata. +1 da parte mia e un altro +1 per l'uso di una funzione anonima.

gbinflames gbinflames
7 nov 2018 01:07:55

Funzionerebbe con relazioni del tipo genitore > figlio > figlio del figlio e, se sì, come? Grazie!

Drewdavid Drewdavid
24 nov 2019 05:01:30
3
15

Non esiste un template specifico per le pagine figlie, ma puoi crearne uno facilmente utilizzando la funzione get_template_part().

Per prima cosa crea un file chiamato "content-child.php".

Poi crea un file chiamato "content.php".

Successivamente, all'interno di page.php, inserisci questo codice:

if( $post->post_parent !== 0 ) {
    get_template_part('content', 'child');
} else {
    get_template_part('content');
}

Tutto ciò che vuoi visualizzare su una pagina figlia dovrà essere inserito all'interno di content-child.php. Mentre ciò che vuoi visualizzare sulle pagine non figlie dovrà essere inserito in content.php.

15 giu 2012 06:42:18
Commenti

Sono riuscito a far funzionare questo codice. Alla fine, non era necessario separarlo così tanto come pensavo, quindi ho semplicemente modificato il tuo codice e l'ho utilizzato in page.php in un paio di casi specifici. Il selettore CSS 'page-child' ha aiutato a sistemare gli ultimi dettagli. Grazie!

timshutes timshutes
15 giu 2012 08:29:32

Fantastico! Ottima soluzione. Come posso impostare un template diverso per Parent > Child > Child? Grazie!

Brightweb Brightweb
26 lug 2012 00:23:16

Stessa domanda di Brightweb...

Drewdavid Drewdavid
24 nov 2019 05:00:11
1

La mia modifica alla soluzione di OzzyCzech sopra riportata. Questa funzione cerca nella directory radice del tema i file il cui nome contiene lo slug del genitore o l'ID del genitore.

  • /radice_tema/child-SLUG_GENITORE.php
  • /radice_tema/child-ID_GENITORE.php
function child_templates($template) {
    global $post;

    if ($post->post_parent) {
        // ottieni la pagina genitore di livello superiore
        $parent = get_post(
            reset(array_reverse(get_post_ancestors($post->ID)))
        );

        // cerca il template figlio basato sullo slug o ID del genitore
        $child_template = locate_template(
            [
                'child-' . $parent->post_name . '.php',
                'child-' . $parent->ID . '.php',
                'child.php',
            ]
        );

        if ($child_template) return $child_template;
    }

    return $template;
}
add_filter( 'page_template', 'child_templates' );
7 mar 2019 18:44:06
Commenti

Ciao - Funzionerebbe con relazioni genitore > figlio > figlio del figlio e, se sì, come? Grazie!

Drewdavid Drewdavid
24 nov 2019 05:01:47
0

Ho assegnato un template specifico a una pagina figlia utilizzando Page Templates

Ho questa radice: localhost:8001/my-custom-post-type/page-one/page-one-sub-child

Creare un template page come indicato nella documentazione.

Nel mio caso è in un file page_panoramica.php ho scritto:

<?php /* 
  * Template Name: Page Panoramica
  * Template Post Type: my-custom-post-type
*/ ?>

Dopo aver assegnato il template alla pagina desiderata

Immagine dimostrativa dell'assegnazione del template

29 mar 2023 12:17:52