最新消息:Welcome to the puzzle paradise for programmers! Here, a well-designed puzzle awaits you. From code logic puzzles to algorithmic challenges, each level is closely centered on the programmer's expertise and skills. Whether you're a novice programmer or an experienced tech guru, you'll find your own challenges on this site. In the process of solving puzzles, you can not only exercise your thinking skills, but also deepen your understanding and application of programming knowledge. Come to start this puzzle journey full of wisdom and challenges, with many programmers to compete with each other and show your programming wisdom! Translated with DeepL.com (free version)

Merge multiple custom post types in a single archive template

matteradmin9PV0评论

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.

Post a comment

comment list (0)

  1. No comments so far