我试图建立一个类似辩论的系统。
其工作原理如下:
页面将显示带有倒计时计时器的帖子,因此用户可以在特定时间段之前提交评论。(这将是用户看到的第一个页面)
在这段时间内提交的所有评论都将显示在子页面中,以便用户可以在那里看到所有评论。
另一个页面将显示评论页面中的一些统计信息,如最佳评论(基于投票),来自插件短代码的投票结果。
所有三个页面将包含相同的帖子(标题、内容)。
这就是我的想法:只要倒计时插件可以在时间结束后显示其他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 -->
最合适的回答,由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\' );