Posts, Post types: Prevent get_page_by_title() parsing query twice.

In `get_page_by_title()` access the populated `WP_Query::posts` property directly rather than via the `WP_Query::get_posts()` method. This removes unnecessary reprocessing of the query.

Follow up to [54234].

Props david.binda, mukesh27, spacedmonkey.
Fixes #56721.



git-svn-id: https://develop.svn.wordpress.org/trunk@54377 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Peter Wilson 2022-10-04 03:31:04 +00:00
parent c87b90fa7b
commit 4a9ab59d91
2 changed files with 23 additions and 1 deletions

View File

@ -5787,7 +5787,7 @@ function get_page_by_title( $page_title, $output = OBJECT, $post_type = 'page' )
'order' => 'ASC',
);
$query = new WP_Query( $args );
$pages = $query->get_posts();
$pages = $query->posts;
if ( empty( $pages ) ) {
return null;

View File

@ -315,4 +315,26 @@ class Tests_Post_GetPageByTitle extends WP_UnitTestCase {
$this->assertSame( $page, $array_a['ID'], 'Should match post id.' );
$this->assertSame( $num_queries, get_num_queries(), 'Should not result in another database query.' );
}
/**
* Ensure get_page_by_title() only runs the query once.
*
* @ticket 56721
* @covers ::get_page_by_title
*/
public function test_should_not_run_query_more_than_once() {
$page = self::factory()->post->create_and_get(
array(
'post_title' => 'some-page',
'post_type' => 'page',
)
);
// Use the `pre_get_posts` hook to ensure the query is only run once.
$ma = new MockAction();
add_action( 'pre_get_posts', array( $ma, 'action' ) );
get_page_by_title( 'some-page' );
$this->assertSame( 1, $ma->get_call_count(), 'Query does not run exactly once.' );
}
}