benc
benc

Reputation: 2018

get_the_title() is returning results from previous loop

I'm attempting to loop thought a custom post type (artists), then each category, then another custom post type (story) which has a relationship with the artist.

The issue is, the function <?php echo get_the_title( $story->ID ); ?> in the final loop is returning a title of the Artist many times over, along with the title of the current custom post. I just need the title of the currentent loops post.

<!-- get all the artists -->

 <?php

  $args = array(

    'post_type' => 'artists'

  );

    $query = new WP_QUERY( $args );

    ?>

    <?php if( $query->have_posts() ) : while( $query->have_posts() ) : $query->the_post(); ?>

        <h1><?php the_title(); ?></h1>

        <p><?php the_field('artist_website'); ?></p> 

    <!--  looping through all the categories -->
            <?php

            $cats = get_categories(); 

                // loop through the categries
                foreach ($cats as $cat) {
                    // setup the cateogory ID
                    $cat_id= $cat->term_id;
                    // Make a header for the cateogry
                    echo "<h2>".$cat->name."</h2>";
                    ?>

                 <!--  looping through the stories that have a relationship with the artist (select_artist) -->
                    <?php
                        $post_type = 'story';

                    $args = array(
                            'post_type' => $post_type,
                            'posts_per_page' => -1,  //show all posts
                            'tax_query' => array(
                                array(
                                    'taxonomy' => 'category',
                                    'field' => 'slug',
                                    'terms' => $cat->slug,
                                )
                            ),
                            'meta_query' => array(
                                array(
                                    'key' => 'select_artist', // name of custom field
                                    'value' => '"' . get_the_ID() . '"', // matches exaclty "123", not just 123.
                                    'compare' => 'LIKE'
                                )
                            )
                        );

                    $stories = new WP_Query($args);

                    ?>

                    <?php if( $stories ): ?>

                        <ul>
                        <?php foreach( $stories as $story ): ?>
                           <!-- Problem echo below -->
                            <?php echo get_the_title( $story->ID ); ?> 

                        <?php endforeach; ?>
                        </ul>
                    <?php endif; ?>


                <?php } // done the foreach statement ?>

        <?php endwhile; wp_reset_postdata(); endif; ?>  

</section>

Upvotes: 0

Views: 911

Answers (1)

johnnyd23
johnnyd23

Reputation: 1705

If you're using WP_Query you should be using a while loop and end with the_post() in order to set up the internal variables that would allow get_the_title() to work properly.

As an added measure you could set the $post variable to a $temp variable before your inner loop, then reset back after.

<?php
$stories = new WP_Query($args);

if( $stories->have_posts() ): 

global $post;
$temp = $post; 
?>

<ul>

    <?php 
    while( $stories->have_posts() ): $stories->the_post();

        the_title(); 

    endwhile;
    $post = $temp;
    ?>

<ul>

<?php endif; ?>

Upvotes: 1

Related Questions