最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Merge multiple custom post types in a single archive template

programmeradmin2浏览0评论

I have multiple custom post types, viz., research, documents, booklets. I have a single archive template for each of them , archive-research.php, archive-documents.php, archive-booklets.php respectively.

I need another template where I display posts from all these CPTs.

For a single CPT, I used the following code:

query_posts( 
  array(
    'post_type' => 'post_type_name_here',
    'posts_per_page' => 4,
    'paged'=>$paged
  ) 
);

Is there any way to merge theme?

I have multiple custom post types, viz., research, documents, booklets. I have a single archive template for each of them , archive-research.php, archive-documents.php, archive-booklets.php respectively.

I need another template where I display posts from all these CPTs.

For a single CPT, I used the following code:

query_posts( 
  array(
    'post_type' => 'post_type_name_here',
    'posts_per_page' => 4,
    'paged'=>$paged
  ) 
);

Is there any way to merge theme?

Share Improve this question edited Apr 8, 2019 at 22:07 Sven 3,6841 gold badge35 silver badges48 bronze badges asked Apr 8, 2019 at 21:29 Sunday LalbiakniaSunday Lalbiaknia 111 silver badge2 bronze badges 7
  • What do you mean merge? – Howard E Commented Apr 9, 2019 at 0:46
  • None of your existing templates should be using query_posts(). WordPress will query the correct posts for you. – Jacob Peattie Commented Apr 9, 2019 at 1:22
  • Create a new page template and use WP_Query with the post_type key having an array with all your post types. – Karun Commented Apr 9, 2019 at 5:14
  • @Karun that's the answer I needed. I don't know that we can use an array for post_type. Thanks – Sunday Lalbiaknia Commented Apr 9, 2019 at 6:21
  • @SundayLalbiaknia use this 'post_type' => array('viz', 'research', 'documents', 'booklets'), – Karun Commented Apr 9, 2019 at 6:23
 |  Show 2 more comments

1 Answer 1

Reset to default 4

As Jacob Peattle mentioned, you should not be using query_posts in your custom archive templates, that's redundant as WP is already going to query those posts for you. What you really need is pre_get_posts (https://codex.wordpress/Plugin_API/Action_Reference/pre_get_posts). That will allow you to conditionally modify the parameters of the main query before it executes. Additionally since you are effectively executing the same query for all 4 CPTs, then it's unnecessary to have 4 separate templates to do so, instead take a look at the template_include filter https://codex.wordpress/Plugin_API/Filter_Reference/template_include

Add the following to your functions file...

//Modify the main query    
function custom_archive_query($query){
   if(is_admin() || !$query->is_main_query()){
      return;
   }
   $cpts = array("research","documents","booklets");
   if(is_post_type_archive($cpts)){
      $query->set('post_type', $cpts);
      return;
   }
}
add_action('pre_get_posts', 'custom_archive_query');

//Add the template redirect
function custom_archive_template($template){
   $cpts = array("research","documents","booklets");
   if(is_post_type_archive($cpts)){
      $new_template = locate_template( array( 'custom_archive-template.php' ) );
      if(!empty($new_template)) return $new_template;
   }
   return $template;
}
add_filter('template_include', 'custom_archive_template');

As an additional note, you may need to adjust your query more than this example, and obviously your custom post type names to match. Your original query is paging at 4 posts per page, that may have undesired results due to the fact that you're combining multiple post types.

发布评论

评论列表(0)

  1. 暂无评论