Arquivo de tema para todas as páginas que são filho de uma página específica

4

É possível na hierarquia de nomenclatura do arquivo de tema atual definir um modelo para todas as páginas que são filho de uma página específica? Por exemplo, nesta navegação:

Sobre nós

  • Contato
  • Quem somos
  • Declaração de mensagens

Existe alguma maneira de criar um arquivo de tema chamado:

page-about-us-all.php

Isso seria aplicado automaticamente a todas as páginas que são filhos de About Us?

UPDATE

Eu fui com uma versão modificada do que a Bainternet sugeriu. Aqui está a função descendente que acabei com:

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);

Isso me permite verificar se é um descendente usando o ID do pai ou do slug. Eu estava preocupado que usar apenas o ID poderia levar a um problema se uma página pai tivesse sido acidentalmente lixeira, não haveria uma boa maneira de fazer isso funcionar novamente sem ter que editar os arquivos do Tema. Com a lesma, pelo menos, há a opção de apenas entrar e criar uma nova página com o mesmo slug e hierarquia.

    
por hereswhatidid 28.03.2011 / 19:45

3 respostas

3

Eu tenho uma função condicional personalizada que faria o trabalho para você.

A função:

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
}

Agora você pergunta como isso pode ajudar você?

Depois de ter essa função salva no arquivo functions.php do seu tema edite o arquivo page.php do seu tema e adicione ao topo algo assim:

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

E você está feito! Nota: este código está assumindo que o seu sobre page id é: 12 e seu arquivo de tema é nomeado: page-about-us-all.php .

    
por Bainternet 28.03.2011 / 20:38
2

Isso pode ser muito mais simples e não depende de funções separadas.

Supondo que queremos verificar se a página atual é filha da página 134 , colocar o seguinte na parte superior do seu page.php seria suficiente:

<?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
}; ?>
    
por Jon Lay 30.04.2014 / 07:39
1

Isso não é possível, por padrão, no sistema de templates do WordPress. A hierarquia de modelos não detecta o relacionamento da página pai-filho. No entanto, eu encontrei esta postagem no blog , explicando um método para automatizar o processo. Eu não tentei implementá-lo, então eu não atesto a sua eficácia, mas pelo menos vale a pena ler.

(Nota: esta postagem do blog prende sua função em 'save_post', o que significa que a alternância de modelos de página acontece somente quando a postagem é salva. Isso geralmente funciona , já que alterar a página pai requer um salvar ação.No entanto, você pode precisar de um gancho diferente, se você precisar executar atualizações retroativas do Modelo de Página.)

    
por Chip Bennett 28.03.2011 / 19:54