¿Existe un archivo de plantilla predeterminado para páginas hijas / subpáginas?

15 jun 2012, 05:47:55
Vistas: 25K
Votos: 6

Esta parece una pregunta muy simple. Estoy buscando algo como sub-page.php o page-child.php donde pueda hacer algunas cosas diferentes en las páginas hijas de mi tema.

Son lo suficientemente diferentes en diseño y contenido que tengo que usar mucho PHP o la clase CSS .page-child para hacer todo el trabajo pesado. Estoy buscando un método más simple.

Una advertencia - me gustaría que esto sucediera automáticamente para no tener que decirle al cliente "asegúrate de seleccionar siempre la plantilla 'subpágina' cuando crees una subpágina", lo cual es precario...

0
Todas las respuestas a la pregunta 4
2
16

Es realmente muy fácil, añade el siguiente código a tu archivo functions.php:

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

        if ($post->post_parent) {

            // obtener la página padre de nivel superior
            $parent = get_post(
               reset(array_reverse(get_post_ancestors($post->ID)))
            );

            // o ...
            // cuando necesitas el post padre más cercano en su lugar
            // $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;
    }
);

Luego puedes preparar plantillas con los siguientes patrones:

  • [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
Comentarios

Esta es una respuesta muy infravalorada, es mucho más versátil que la respuesta aceptada. +1 de mi parte y otro +1 por usar una función anónima.

gbinflames gbinflames
7 nov 2018 01:07:55

¿Funcionaría esto con relaciones padre > hijo > hijo del hijo, y si es así, cómo? ¡Gracias!

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

No existe una plantilla específica para páginas hijas, pero puedes hacerlo fácilmente con la función get_template_part().

Primero, crea un archivo llamado "content-child.php".

Segundo, crea un archivo llamado "content.php".

Luego, dentro de page.php, coloca esto:

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

Cualquier contenido que desees mostrar en una página hija deberá colocarse dentro de content-child.php. Lo que quieras mostrar en páginas que no sean hijas irá en content.php.

15 jun 2012 06:42:18
Comentarios

Logré hacer que este código funcione. Resultó que no necesitaba separarlo tanto como pensaba, así que simplemente ajusté tu código y lo usé en page.php en un par de instancias específicas. El selector CSS 'page-child' ayudó a pulir los detalles. ¡Gracias!

timshutes timshutes
15 jun 2012 08:29:32

¡Genial! Gran solución. ¿Cómo configurar una plantilla diferente para Padre > Hijo > Hijo? ¡Gracias!

Brightweb Brightweb
26 jul 2012 00:23:16

La misma pregunta que Brightweb...

Drewdavid Drewdavid
24 nov 2019 05:00:11
1

Mi modificación de la solución de OzzyCzech mencionada anteriormente. Esta función busca en el directorio raíz del tema archivos cuyo nombre contenga el slug o el ID del elemento padre.

  • /raiz_del_tema/hijo-SLUG_PADRE.php
  • /raiz_del_tema/hijo-ID_PADRE.php
function plantillas_hijo($template) {
    global $post;

    if ($post->post_parent) {
        // obtener la página padre de nivel superior
        $parent = get_post(
            reset(array_reverse(get_post_ancestors($post->ID)))
        );

        // encontrar la plantilla hijo basada en el slug o ID del padre
        $plantilla_hijo = locate_template(
            [
                'hijo-' . $parent->post_name . '.php',
                'hijo-' . $parent->ID . '.php',
                'hijo.php',
            ]
        );

        if ($plantilla_hijo) return $plantilla_hijo;
    }

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

Hola - ¿Funcionaría esto con relaciones padre > hijo > hijo de hijo, y si es así, cómo? ¡Gracias!

Drewdavid Drewdavid
24 nov 2019 05:01:47
0

He asignado una plantilla específica a una página hija usando Plantillas de Página

Tengo esta ruta: localhost:8001/my-custom-post-type/page-one/page-one-sub-child

Creé una plantilla de página como en la documentación.

En mi caso, está en un archivo page_panoramica.php donde escribí:

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

Después de asignar la plantilla a la página que necesitas

Imagen descriptiva de asignación de plantilla

29 mar 2023 12:17:52