шаблон страницы для настраиваемого типа сообщения

Я пытаюсь создать дебатовую систему.

Он будет работать следующим образом:

На странице будет отображаться сообщение с таймером обратного отсчета, поэтому пользователь сможет отправлять комментарии до определенного периода времени. (это будет первая страница, которую увидят пользователи)

Все комментарии, представленные за этот период времени, будут отображаться на дочерней странице, чтобы пользователи могли видеть все комментарии.

На другой странице будут отображаться некоторые статистические данные на странице комментариев, такие как лучшие комментарии (основанные на голосах), результаты опроса из короткого кода плагина.

Все три страницы будут содержать одну и ту же запись (название, содержание).

Вот как я думаю, чтобы подойти к этому: до тех пор, пока плагин обратного отсчета имеет возможность отображать другой URL по прошествии времени, я могу заменить первую страницу после окончания обратного отсчета со страницей, содержащей результаты опроса.

Таким образом, создавая три страницы в отношениях родитель-ребенок, это может работать.

Вкратце, каждый из них будет иметь другой дополнительный контент (на первой странице будет раздел комментариев, в котором пользователи отправят комментарий, на другой странице будут представлены комментарии, представленные в первом, а третий будет содержать информацию со страницы комментариев, например результаты опроса и лучшие комментарии, а также заменит первую страницу после окончания обратного отсчета).

Первой страницей будет единственный {myCPT} .php.

Вторая страница, которая будет дочерней на первой странице, получая комментарии от нее. Я создам это сначала из панели управления, назначая его как дочерний элемент на первую страницу и использую для него шаблон, похожий на страницу – {'slug'}. Php Третья страница такая же, но, конечно, с другим шаблоном.

Я много думал, и это единственное решение.

Это путь? Или это можно сделать намного проще? LATER EDIT: я изменил cpt с моим именем, и теперь я получаю следующее:

Fatal error: Call to undefined function wpse121567_get_cpt_hierarchy() 

SNIPPET FROM MY single-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 --> 

Я бы использовал иерархию post-type и файл шаблона single-{cpt}.php , чтобы выполнить все, что вам нужно.

Вы можете использовать $post->post_parent (рекурсивно), чтобы определить, является ли текущий CPT родительским, дочерним или внучатым, а также запрашивать контент из родительских и grand-parent CPT для вывода.

Иерархия CPT

Вы можете создать пользовательскую функцию для определения иерархии текущего CPT; например:

 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

«Родительский» 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() комментарии родительского 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 } } 

Grandchild CPT

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

Как я уже упоминал в своем комментарии, для этого я бы использовал некоторые переписывающие конечные точки . Таким образом, каждый пользовательский пост представляет собой только одну запись на стороне администратора, где вы можете централизованно управлять всем содержимым для этой отдельной персонализированной почты. Используйте add_meta_box и / или пользовательские поля для добавления дополнительных данных в каждое сообщение.

Во-первых, добавьте конечные точки:

 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 } 

РЕДАКТИРОВАТЬ

Кроме того, вы можете использовать фильтр 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' );