WordPress custom loop in template part

I’m using a theme for some WordPress-integrated software which means that I am basically stuck with the template hierarchy, otherwise I’d just set up a custom template to get around this.

Anyway, I have my page.php, which looks a little like the following

Read More
<?php //start the main loop
 if ( have_posts() ) : 
   while ( have_posts() ) : 
     the_post(); 
?>
<?php 
     if ( is_page('contact-us') ) {
      get_template_part( 'content', 'contact' );
     }else{
      get_template_part( 'content', 'page' );                   
     }
?>
<?php //end the main loop
     endwhile; 
    else: 
?>
      Something is missing
<?php 
    endif; 
?>

This works fine, and as expected, I am able to add html within content-page.php

However, I would like to add a custom loop within content-page.php to display customer testimonials. I’ve attempted this with the code below inside content-page.php:

<?php //close the main loop
endwhile; else : ?>
<p><?php _e( 'Sorry, no posts matched your criteria.' ); ?></p>
<?php endif; ?>

<?php
//close the main loop and open a custom loop
wp_reset_postdata();
$args = array (
    'post_type' => 'testimonial',
    'posts_per_page' => 5,
    'orderby' => 'rand'
);

$the_query = new WP_Query ( $args );

if ( have_posts() ) : while ( $the_query ->have_posts() ) : $the_query ->the_post(); ?>

Do HTML stuff here

<?php //close the custom loop
endwhile; else: ?>
Uh oh, there is meant to be a testimonial here. Please create some.
<?php endif; ?>

<?php //re-open the main loop
    wp_reset_postdata();
    if ( have_posts() ) : while ( have_posts() ) : the_post();
?>    

This code creates a PHP error (unexpected endwhile where I attempt to close the main loop). However, I put this exact same code straight inside page.php, it works. It only errors when inside content-page.php. Am I not able to include custom loops with get_template_part?

Related posts

Leave a Reply

1 comment

  1. the last endwhile and endif are not closed

    <?php //re-open the main loop
        wp_reset_postdata();
        if ( have_posts() ) : 
          while ( have_posts() ) : 
            the_post();
          endwhile; 
        endif;
    ?>