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.org/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.org/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.
query_posts()
. WordPress will query the correct posts for you.WP_Query
with thepost_type
key having an array with all your post types.post_type
. Thanks'post_type' => array('viz', 'research', 'documents', 'booklets'),