作为特定页面的子级的所有页面的主题文件

时间:2011-03-28 作者:hereswhatidid

在当前主题文件命名层次结构中,是否可以为作为特定页面子级的所有页面定义模板?例如,在此导航中:

关于我们

联系我们是谁消息声明有没有办法制作一个名为以下内容的主题文件:

关于我们所有人的页面。php

这将自动应用于所有属于“关于我们”的子页面?

UPDATE

我接受了贝因特建议的修改版本。下面是我最终得到的后代函数:

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);
这允许我使用父代ID或slug来验证它是子代。我担心,如果父页面被意外破坏,仅使用ID可能会导致问题。如果不必编辑主题文件,就无法再次使用该ID。对于slug,至少可以选择跳入并创建具有相同slug和层次结构的新页面。

3 个回复
最合适的回答,由SO网友:Bainternet 整理而成

我有一个方便的定制条件函数,可以为您完成这项工作。

The function:

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

Usage:

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
}

Now you ask how can this help you?

将此函数保存在主题函数中后。php文件编辑主题的page.php 在最顶端归档并添加如下内容:

if (is_child_page(12)){
    include (TEMPLATEPATH . \'/page-about-us-all.php\');
    exit();
}
你完了!注意:此代码假设您的关于页面id为:12,主题文件的名称为:page-about-us-all.php.

SO网友:Jon Lay

这可以简单得多,并且不依赖于单独的函数。

假设我们要检查当前页面是否是page的子页面134, 将以下内容放入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
}; ?>

SO网友:Chip Bennett

默认情况下,这在WordPress模板系统中是不可能的。这个template hierarchy 不检测父-子页面关系。然而,我确实发现this blog post, 解释自动化流程的方法。我没有尝试实施它,所以我不能保证它的有效性,但至少值得一读。

(注意:此博客文章将其功能挂接到“save\\u post”中,这意味着页面模板切换仅在文章保存时发生。这通常应该会起作用,因为更改父页面需要保存操作。但是,如果需要执行追溯页面模板更新,则可能需要不同的挂接。)

结束

相关推荐

Adding goodies to themes

如何在主题更新时向Arjuna-X等主题添加内容而不丢失?儿童主题是一种很好的方式,还是有其他选择?如果新版本的主题对我添加的功能具有本机支持,该怎么办?