diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index 41fc4709a3..6657e462c4 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -5057,7 +5057,8 @@ function get_pages( $args = array() ) { $last_changed = wp_cache_get_last_changed( 'posts' ); $cache_key = "get_pages:$key:$last_changed"; - if ( $cache = wp_cache_get( $cache_key, 'posts' ) ) { + $cache = wp_cache_get( $cache_key, 'posts' ); + if ( false !== $cache ) { // Convert to WP_Post instances. $pages = array_map( 'get_post', $cache ); /** This filter is documented in wp-includes/post.php */ @@ -5218,6 +5219,8 @@ function get_pages( $args = array() ) { $pages = $wpdb->get_results( $query ); if ( empty( $pages ) ) { + wp_cache_set( $cache_key, array(), 'posts' ); + /** This filter is documented in wp-includes/post.php */ $pages = apply_filters( 'get_pages', array(), $r ); return $pages; diff --git a/tests/phpunit/tests/post/getPages.php b/tests/phpunit/tests/post/getPages.php index f771563559..2271cae672 100644 --- a/tests/phpunit/tests/post/getPages.php +++ b/tests/phpunit/tests/post/getPages.php @@ -700,4 +700,26 @@ class Tests_Post_getPages extends WP_UnitTestCase { $exclude6 = get_pages( array( 'exclude_tree' => array( $post_id1, $post_id3 ) ) ); $this->assertCount( 2, $exclude6 ); } + + /** + * @ticket 43514 + */ + function test_get_pages_cache_empty() { + global $wpdb; + + wp_cache_delete( 'last_changed', 'posts' ); + $this->assertFalse( wp_cache_get( 'last_changed', 'posts' ) ); + + $num_queries = $wpdb->num_queries; + + $pages = get_pages(); // Database gets queried + + $this->assertEquals( $num_queries + 1, $wpdb->num_queries ); + + $num_queries = $wpdb->num_queries; + + $pages = get_pages(); // Database should not get queried + + $this->assertEquals( $num_queries, $wpdb->num_queries ); + } }