Archivo de tema para todas las páginas que son hijas de una página específica

4

¿Es posible dentro de la jerarquía de nombres de archivos de tema actual definir una plantilla para todas las páginas que son un elemento secundario de una página específica? Por ejemplo, en esta navegación:

Acerca de nosotros

  • Contacto
  • Quiénes somos
  • Declaración del mensaje

¿Hay alguna forma de hacer un archivo de tema llamado algo así como:

page-about-us-all.php

Eso se aplicaría automáticamente a todas las páginas que son hijos de ¿Quiénes somos?

ACTUALIZAR

Fui con una versión modificada de lo que Bainternet había sugerido. Aquí está la función descendiente con la que terminé:

function is_descendant($ancestor, $tofind = 0) {
    global $post;
    if ($tofind == 0) $tofind = $post->ID;
    $arrpostids = get_post_ancestors($tofind);
    $arrpostslugs = array();
    foreach($arrpostids as $postid) {
        $temppost = get_post($postid);
        array_push($arrpostslugs, $temppost->post_name);
    }
    return (in_array($ancestor, $arrpostids) || in_array($ancestor, $arrpostslugs));
}
// Example use:
is_descendant('about-us');
is_descendant(123);
is_descendant('about-us', 134);

Esto me permite verificar que es un descendiente usando el ID del padre o la babosa. Me preocupaba que el uso de la ID solo pudiera llevar a un problema si una página principal se hubiera destruido accidentalmente, no habría una buena manera de hacerlo funcionar nuevamente sin tener que editar los archivos del Tema. Con la babosa, al menos, existe la opción de simplemente saltar y crear una nueva página con la misma babosa y jerarquía.

    
pregunta hereswhatidid 28.03.2011 - 19:45

3 respuestas

3

Tengo una pequeña función condicional hecha a la medida que haría el trabajo por ti.

La función:

function is_child_page($page = NULL){
    global $post;
    if ($page == NULL){
        $p = get_post($post->ID);
        if ($p->post_parent  > 0 ){
            return true;
        }else{
            return false;
        }
    }
    $args = array( 'child_of' => (int)$page);
    $pages = get_pages($args); 
    foreach ($pages as $p){
        if ($p->ID == $post->ID){
            return true;
            break;
        }
    }
    return false;
}

Uso :

if (is_child_page()){
    //this page has a parent page
}

if (is_child_page(23)){
    //this page is a child page of the page with the ID of 23
}

Ahora, ¿cómo puede ayudarlo?

Después de guardar esta función en el archivo functions.php de su tema edite el archivo page.php de su tema y agregue en la parte superior algo como esto:

if (is_child_page(12)){
    include (TEMPLATEPATH . '/page-about-us-all.php');
    exit();
}

Y ya has terminado! Nota: este código asume que su ID de página acerca de: 12 y su archivo de tema se llama: page-about-us-all.php .

    
respondido por el Bainternet 28.03.2011 - 20:38
2

Esto puede ser mucho más simple y no dependerá de funciones separadas.

Suponiendo que deseamos comprobar si la página actual es hija de la página 134 , basta con colocar lo siguiente en la parte superior de su page.php :

<?php
if (134 == $post->post_parent) {
    include (TEMPLATEPATH . '/page-mysubpagetemplate.php'); // Name this for your child page template name
    exit();
} else {
    // Do something else
    // You might want to stick your regular page.php code in here, or alternatively, you could call another template
}; ?>
    
respondido por el Jon Lay 30.04.2014 - 07:39
1

Esto no es posible, de manera predeterminada, en el sistema de plantillas de WordPress. La jerarquía de plantillas no detecta la relación de la página padre-hijo. Sin embargo, encontré esta entrada de blog , explicando un método para automatizar el proceso. No he intentado implementarlo, así que no garantizo su efectividad, pero al menos vale la pena leerlo.

(Nota: esta publicación del blog enlaza su función en 'save_post', lo que significa que el cambio de Plantilla de página solo ocurre cuando se guarda la publicación. Esto debería funcionar generalmente , ya que cambiar la página principal requiere una Sin embargo, es posible que necesite un enlace diferente, si necesita realizar actualizaciones retroactivas de la Plantilla de página.)

    
respondido por el Chip Bennett 28.03.2011 - 19:54

Lea otras preguntas en las etiquetas