Title: WP_Query::generate_postdata
Published: May 7, 2019
Last modified: February 24, 2026

---

# WP_Query::generate_postdata( WP_Post|object|int $post ): array|false

## In this article

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

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

Generates post data.

## 󠀁[Parameters](https://developer.wordpress.org/reference/classes/wp_query/generate_postdata/?output_format=md#parameters)󠁿

 `$post`[WP_Post](https://developer.wordpress.org/reference/classes/wp_post/)|object
|intrequired

[WP_Post](https://developer.wordpress.org/reference/classes/wp_post/) instance or
Post ID/object.

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

 array|false Elements of post or false on failure.

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

    ```php
    public function generate_postdata( $post ) {

    	if ( ! ( $post instanceof WP_Post ) ) {
    		$post = get_post( $post );
    	}

    	if ( ! $post ) {
    		return false;
    	}

    	$id = (int) $post->ID;

    	$authordata = get_userdata( $post->post_author );

    	$currentday   = false;
    	$currentmonth = false;

    	$post_date = $post->post_date;
    	if ( ! empty( $post_date ) && '0000-00-00 00:00:00' !== $post_date ) {
    		// Avoid using mysql2date for performance reasons.
    		$currentmonth = substr( $post_date, 5, 2 );
    		$day          = substr( $post_date, 8, 2 );
    		$year         = substr( $post_date, 2, 2 );

    		$currentday = sprintf( '%s.%s.%s', $day, $currentmonth, $year );
    	}

    	$numpages  = 1;
    	$multipage = 0;
    	$page      = $this->get( 'page' );
    	if ( ! $page ) {
    		$page = 1;
    	}

    	/*
    	 * Force full post content when viewing the permalink for the $post,
    	 * or when on an RSS feed. Otherwise respect the 'more' tag.
    	 */
    	if ( get_queried_object_id() === $post->ID && ( $this->is_page() || $this->is_single() ) ) {
    		$more = 1;
    	} elseif ( $this->is_feed() ) {
    		$more = 1;
    	} else {
    		$more = 0;
    	}

    	$content = $post->post_content;
    	if ( str_contains( $content, '<!--nextpage-->' ) ) {
    		$content = str_replace( "\n<!--nextpage-->\n", '<!--nextpage-->', $content );
    		$content = str_replace( "\n<!--nextpage-->", '<!--nextpage-->', $content );
    		$content = str_replace( "<!--nextpage-->\n", '<!--nextpage-->', $content );

    		// Remove the nextpage block delimiters, to avoid invalid block structures in the split content.
    		$content = str_replace( '<!-- wp:nextpage -->', '', $content );
    		$content = str_replace( '<!-- /wp:nextpage -->', '', $content );

    		// Ignore nextpage at the beginning of the content.
    		if ( str_starts_with( $content, '<!--nextpage-->' ) ) {
    			$content = substr( $content, 15 );
    		}

    		$pages = explode( '<!--nextpage-->', $content );
    	} else {
    		$pages = array( $post->post_content );
    	}

    	/**
    	 * Filters the "pages" derived from splitting the post content.
    	 *
    	 * "Pages" are determined by splitting the post content based on the presence
    	 * of `<!-- nextpage -->` tags.
    	 *
    	 * @since 4.4.0
    	 *
    	 * @param string[] $pages Array of "pages" from the post content split by `<!-- nextpage -->` tags.
    	 * @param WP_Post  $post  Current post object.
    	 */
    	$pages = apply_filters( 'content_pagination', $pages, $post );

    	$numpages = count( $pages );

    	if ( $numpages > 1 ) {
    		if ( $page > 1 ) {
    			$more = 1;
    		}
    		$multipage = 1;
    	} else {
    		$multipage = 0;
    	}

    	$elements = compact( 'id', 'authordata', 'currentday', 'currentmonth', 'page', 'pages', 'multipage', 'more', 'numpages' );

    	return $elements;
    }
    ```

[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#L4878)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/6.9.4/src/wp-includes/class-wp-query.php#L4878-L4971)

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

 [apply_filters( ‘content_pagination’, string[] $pages, WP_Post $post )](https://developer.wordpress.org/reference/hooks/content_pagination/)

Filters the “pages” derived from splitting the post content.

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

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

Determines whether the query is for an existing single page.

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

Determines whether the query is for an existing single post.

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

Determines whether the query is for a feed.

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

Retrieves the value of a query variable.

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

Retrieves the ID of the currently queried object.

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

Retrieves user info by user ID.

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

Calls the callback functions that have been added to a filter hook.

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

Retrieves post data given a post ID or post object.

  |

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

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

Generates post data.

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

Sets up global post data.

  |

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

| Version | Description | 
| [5.2.0](https://developer.wordpress.org/reference/since/5.2.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%2Fgenerate_postdata%2F)
before being able to contribute a note or feedback.