Title: WP_Query::have_posts
Published: April 25, 2014
Last modified: February 24, 2026

---

# WP_Query::have_posts(): bool

## In this article

 * [Description](https://developer.wordpress.org/reference/classes/wp_query/have_posts/?output_format=md#description)
 * [Return](https://developer.wordpress.org/reference/classes/wp_query/have_posts/?output_format=md#return)
 * [Source](https://developer.wordpress.org/reference/classes/wp_query/have_posts/?output_format=md#source)
 * [Hooks](https://developer.wordpress.org/reference/classes/wp_query/have_posts/?output_format=md#hooks)
 * [Related](https://developer.wordpress.org/reference/classes/wp_query/have_posts/?output_format=md#related)
 * [Changelog](https://developer.wordpress.org/reference/classes/wp_query/have_posts/?output_format=md#changelog)

[ Back to top](https://developer.wordpress.org/reference/classes/wp_query/have_posts/?output_format=md#wp--skip-link--target)

Determines whether there are more posts available in the loop.

## 󠀁[Description](https://developer.wordpress.org/reference/classes/wp_query/have_posts/?output_format=md#description)󠁿

Calls the [‘loop_end’](https://developer.wordpress.org/reference/hooks/loop_end/)
action when the loop is complete.

## 󠀁[Return](https://developer.wordpress.org/reference/classes/wp_query/have_posts/?output_format=md#return)󠁿

 bool True if posts are available, false if end of the loop.

## 󠀁[Source](https://developer.wordpress.org/reference/classes/wp_query/have_posts/?output_format=md#source)󠁿

    ```php
    public function have_posts() {
    	if ( $this->current_post + 1 < $this->post_count ) {
    		return true;
    	} elseif ( $this->current_post + 1 === $this->post_count && $this->post_count > 0 ) {
    		/**
    		 * Fires once the loop has ended.
    		 *
    		 * @since 2.0.0
    		 *
    		 * @param WP_Query $query The WP_Query instance (passed by reference).
    		 */
    		do_action_ref_array( 'loop_end', array( &$this ) );

    		// Do some cleaning up after the loop.
    		$this->rewind_posts();
    	} elseif ( 0 === $this->post_count ) {
    		$this->before_loop = false;

    		/**
    		 * Fires if no results are found in a post query.
    		 *
    		 * @since 4.9.0
    		 *
    		 * @param WP_Query $query The WP_Query instance.
    		 */
    		do_action( 'loop_no_results', $this );
    	}

    	$this->in_the_loop = false;
    	return false;
    }
    ```

[View all references](https://developer.wordpress.org/reference/files/wp-includes/class-wp-query.php/)
[View on Trac](https://core.trac.wordpress.org/browser/tags/6.9.4/src/wp-includes/class-wp-query.php#L3832)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/6.9.4/src/wp-includes/class-wp-query.php#L3832-L3862)

## 󠀁[Hooks](https://developer.wordpress.org/reference/classes/wp_query/have_posts/?output_format=md#hooks)󠁿

 [do_action_ref_array( ‘loop_end’, WP_Query $query )](https://developer.wordpress.org/reference/hooks/loop_end/)

Fires once the loop has ended.

 [do_action( ‘loop_no_results’, WP_Query $query )](https://developer.wordpress.org/reference/hooks/loop_no_results/)

Fires if no results are found in a post query.

## 󠀁[Related](https://developer.wordpress.org/reference/classes/wp_query/have_posts/?output_format=md#related)󠁿

| Uses | Description | 
| [WP_Query::rewind_posts()](https://developer.wordpress.org/reference/classes/wp_query/rewind_posts/)`wp-includes/class-wp-query.php` |

Rewinds the posts and resets post index.

  | 
| [do_action_ref_array()](https://developer.wordpress.org/reference/functions/do_action_ref_array/)`wp-includes/plugin.php` |

Calls the callback functions that have been added to an action hook, specifying arguments in an array.

  | 
| [do_action()](https://developer.wordpress.org/reference/functions/do_action/)`wp-includes/plugin.php` |

Calls the callback functions that have been added to an action hook.

  |

[Show 1 more](https://developer.wordpress.org/reference/classes/wp_query/have_posts/?output_format=md#)
[Show less](https://developer.wordpress.org/reference/classes/wp_query/have_posts/?output_format=md#)

| Used by | Description | 
| [get_feed_build_date()](https://developer.wordpress.org/reference/functions/get_feed_build_date/)`wp-includes/feed.php` |

Gets the UTC time of the most recently modified post from [WP_Query](https://developer.wordpress.org/reference/classes/wp_query/).

  | 
| [have_posts()](https://developer.wordpress.org/reference/functions/have_posts/)`wp-includes/query.php` |

Determines whether current WordPress query has posts to loop over.

  |

## 󠀁[Changelog](https://developer.wordpress.org/reference/classes/wp_query/have_posts/?output_format=md#changelog)󠁿

| Version | Description | 
| [1.5.0](https://developer.wordpress.org/reference/since/1.5.0/) | Introduced. |

## User Contributed Notes

You must [log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Fclasses%2Fwp_query%2Fhave_posts%2F)
before being able to contribute a note or feedback.