自定义帖子类型的页面模板

时间:2013-11-07 作者:agis

我试图建立一个类似辩论的系统。

其工作原理如下:

页面将显示带有倒计时计时器的帖子,因此用户可以在特定时间段之前提交评论。(这将是用户看到的第一个页面)

在这段时间内提交的所有评论都将显示在子页面中,以便用户可以在那里看到所有评论。

另一个页面将显示评论页面中的一些统计信息,如最佳评论(基于投票),来自插件短代码的投票结果。

所有三个页面将包含相同的帖子(标题、内容)。

这就是我的想法:只要倒计时插件可以在时间结束后显示其他URL,我就可以在倒计时结束后将第一页替换为包含投票结果的页面。

因此,通过在父子关系中创建三个页面,这可以起作用。

简而言之,每个页面都有不同的附加内容(第一页将有一个评论部分,用户将在其中提交评论,另一页将包含第一页中提交的评论,第三页将包含评论页面中的信息,如民意调查结果和最佳评论,并且在倒计时结束后将替换第一页。)

第一页将是单个{myCPT}。php。

第二页,它将是第一页的子页,从中获取评论。我将首先从仪表板创建它,将其作为子级分配到第一个页面,并为其使用类似于页面{\'slug}的模板。php第三页是相同的,但当然有不同的模板。

我想了很多,这似乎是唯一的解决办法。

这是路吗?或者可以用更简单的方法来完成?LATER EDIT:我修改了cpt 用我的名字,现在我得到这个:

Fatal error: Call to undefined function wpse121567_get_cpt_hierarchy() 
来自我的单个cpt的代码片段。php:

<div id="content" class="span9" role="main">




<?php if ( \'debate-parent\' == wpse121567_get_cpt_hierarchy() ) {
    // Normal loop here
    if ( have_posts() ) : while ( have_posts() ) : the_post();

    get_template_part( \'inc/post-format/single\', get_post_format() ); 
    endwhile; endif;
} 
// Child CPT
else if ( \'debate-child\' == wpse121567_get_cpt_hierarchy() ) {
    // Globalize post object
    global $post;

    // Output Parent CPT title and content
    $parent = get_post( $post->post_parent );
    echo \'<h1>\' . $parent->post_title . \'</h1>\';
    echo \'<div>\' . apply_filters( \'the_content\', $parent->post_content ) . \'</div>\';

    // Fetch parent CPT comments
    $parent_cpt_comments = get_comments( array(
        \'post_id\' => $post->post_parent,
        \'status\' => \'approve\'
    ) );
    // Loop through parent CPT comments
    foreach ( $parent_cpt_comments as $comment ) {
        // Output comment list markup here
    }
}
// Grandchild CPT
else if ( \'debate-grandchild\' == wpse121567_get_cpt_hierarchy() ) {
    // Comment Stats code goes here


?>

    <?php 


        $enable_rtl         = of_get_option(\'enable_rtl\', false);



        if(!of_get_option(\'disable_pagination\')){

            if($enable_rtl){

                $next_post = get_adjacent_post( false, \'\', true ); 

                $prev_post = get_adjacent_post( false, \'\', false ); 

            }else{

                $next_post = get_adjacent_post( false, \'\', false ); 

                $prev_post = get_adjacent_post( false, \'\', true ); 

            }

            ?>

            <?php

        }



    // show related posts by tag

    if(!of_get_option(\'disable_related_posts\')){ 

        get_template_part( \'inc/related-posts\' );

    }





    // If comments are open or we have at least one comment, load up the default comment template provided by Wordpress

    if ( comments_open()  )

        comments_template( \'\', true );



 }else{ // Well, if there are no posts to display and loop through, let\'s apologize to the reader (also your 404 error) ?>



<article class="post error">

    <h1 class="404"><?php _e(\'Page not found\', \'outbox\'); ?></h1>

</article>



<?php } // OK, I think that takes care of both scenarios (having a post or not having a post to show) ?>

</div><!-- #content .site-content -->

2 个回复
最合适的回答,由SO网友:Chip Bennett 整理而成

我会利用post类型层次结构single-{cpt}.php 模板文件,以完成您所追求的一切。

您可以使用$post->post_parent (递归)确定当前CPT是父级、子级还是孙级,并查询父级和父级CPT的内容以获得输出。

CPT层次结构

您可以创建一个自定义函数来确定当前CPT的层次结构;e、 g.:

function wpse121567_get_cpt_hierarchy() {
    // Make sure it\'s the right CPT
    if ( \'cpt-slug\' != get_post_type() ) {
        return false;
    }
    // Globalize the post object
    global $post;
    // Parent CPT
    if ( 0 == $post->post_parent ) {
        return \'cpt-parent\';
    }
    // Not a parent CPT, so fetch current post parent
    $parent = get_post( $post->post_parent );
    // Child CPT
    if ( 0 == $parent->post_parent ) {
        return \'cpt-child\';
    } else {
        return \'cpt-grandchild\';
    }
}
“父”CPT可以简单地使用普通循环来显示辩论标题、内容等:

if ( \'cpt-parent\' == wpse121567_get_cpt_hierarchy() ) {
    // Normal loop here
    if ( have_posts() ) : while ( have_posts() ) : the_post();
        // Normal loop markup
    endwhile; endif;
}
子CPT“子”CPT可以使用get_comments() 并显示它们:

if ( \'cpt-child\' == wpse121567_get_cpt_hierarchy() ) {
    // Globalize post object
    global $post;

    // Output Parent CPT title and content
    $parent = get_post( $post->post_parent );
    echo \'<h1>\' . $parent->post_title . \'</h1>\';
    echo \'<div>\' . apply_filters( \'the_content\', $parent->post_content ) . \'</div>\';

    // Fetch parent CPT comments
    $parent_cpt_comments = get_comments( array(
        \'post_id\' => $post->post_parent,
        \'status\' => \'approve\'
    ) );
    // Loop through parent CPT comments
    foreach ( $parent_cpt_comments as $comment ) {
        // Output comment list markup here
    }
}
“孙子”CPT可以获取父CPT的统计信息(使用您选择的任何方法):

if ( \'cpt-grandchild\' == wpse121567_get_cpt_hierarchy() ) {
    // Comment Stats code goes here
}
一体式模板文件single-{cpt}.php将所有内容放在一起:

get_header();

// Parent CPT
if ( \'cpt-parent\' == wpse121567_get_cpt_hierarchy() ) {
    // Normal loop here
    if ( have_posts() ) : while ( have_posts() ) : the_post();
        // Normal loop markup
    endwhile; endif;
} 
// Child CPT
else if ( \'cpt-child\' == wpse121567_get_cpt_hierarchy() ) {
    // Globalize post object
    global $post;

    // Output Parent CPT title and content
    $parent = get_post( $post->post_parent );
    echo \'<h1>\' . $parent->post_title . \'</h1>\';
    echo \'<div>\' . apply_filters( \'the_content\', $parent->post_content ) . \'</div>\';

    // Fetch parent CPT comments
    $parent_cpt_comments = get_comments( array(
        \'post_id\' => $post->post_parent,
        \'status\' => \'approve\'
    ) );
    // Loop through parent CPT comments
    foreach ( $parent_cpt_comments as $comment ) {
        // Output comment list markup here
    }
}
// Grandchild CPT
else if ( \'cpt-grandchild\' == wpse121567_get_cpt_hierarchy() ) {
    // Comment Stats code goes here
}

get_footer();

SO网友:Milo

正如我在评论中提到的,我会使用一些rewrite endpoints 为了这个。这样,每个自定义帖子都只是管理端的一个条目,您可以集中管理该自定义帖子的所有内容。使用add_meta_box 和/或Custom Fields 为每篇文章添加额外数据。

首先,添加端点:

function wpa121567_rewrite_endpoints(){
    add_rewrite_endpoint( \'comments\', EP_PERMALINK );
    add_rewrite_endpoint( \'stats\', EP_PERMALINK );
}
add_action( \'init\', \'wpa121567_rewrite_endpoints\' );
刷新重写规则后,您的每个自定义帖子将能够使用两个额外的永久链接:

site.com/your-custom-type-slug/single-custom-post-name/
site.com/your-custom-type-slug/single-custom-post-name/comments/
site.com/your-custom-type-slug/single-custom-post-name/stats/
然后在你的single-{cpt}.php 模板,您可以检查请求是否用于注释或统计页面,并包括或输出所需的数据:

if( array_key_exists( \'comments\', $wp_query->query_vars ) ){
    // the request is for the comments page
} elseif( array_key_exists( \'stats\', $wp_query->query_vars ) ) {
    // the request is for the stats page
} else {
    // the request is for the main post
}

EDIT

此外,您可以使用single_template 筛选以根据视图包括单独的模板:

function wpa_post_type_template( $single_template ){
    global $post;
    if ( \'your-cpt-slug\' == $post->post_type ) {
        if( array_key_exists( \'comments\', $wp_query->query_vars ) ){
            $single_template = locate_template( \'cpt-comments.php\', false );
        } elseif( array_key_exists( \'stats\', $wp_query->query_vars ) ) {
            $single_template = locate_template( \'cpt-stats.php\', false );
        }
    }
    return $single_template;
}
add_filter( \'single_template\', \'wpa_post_type_template\' );

结束

相关推荐

rewrite rules hierarchical

我希望我的WordPress遵循以下规则:/productes/ 包含所有产品的页面/productes/[category]/ 包含该类别所有产品的分类页面/productes/[category]/[subcategory]/ 包含该类别所有产品(与2相同)的分类页面/[productes]/[category]/[product]/ A.single-productes.php 将显示类别产品/[productes]/[category]/[subcategory]/[product]/ A.sin