In `get_bookmarks()`, don't cache if 'orderby=rand'.

Props lukecavanagh, prettyboymp, c3mdigital, MikeHansenMe.
Fixes #18356.

git-svn-id: https://develop.svn.wordpress.org/trunk@37565 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Boone Gorges 2016-05-25 18:29:01 +00:00
parent a27b379144
commit 1d3511ba8c
2 changed files with 29 additions and 3 deletions

View File

@ -128,7 +128,8 @@ function get_bookmarks( $args = '' ) {
$r = wp_parse_args( $args, $defaults ); $r = wp_parse_args( $args, $defaults );
$key = md5( serialize( $r ) ); $key = md5( serialize( $r ) );
if ( $cache = wp_cache_get( 'get_bookmarks', 'bookmark' ) ) { $cache = false;
if ( 'rand' !== $r['orderby'] && $cache = wp_cache_get( 'get_bookmarks', 'bookmark' ) ) {
if ( is_array( $cache ) && isset( $cache[ $key ] ) ) { if ( is_array( $cache ) && isset( $cache[ $key ] ) ) {
$bookmarks = $cache[ $key ]; $bookmarks = $cache[ $key ];
/** /**
@ -285,8 +286,10 @@ function get_bookmarks( $args = '' ) {
$results = $wpdb->get_results( $query ); $results = $wpdb->get_results( $query );
$cache[ $key ] = $results; if ( 'rand()' !== $orderby ) {
wp_cache_set( 'get_bookmarks', $cache, 'bookmark' ); $cache[ $key ] = $results;
wp_cache_set( 'get_bookmarks', $cache, 'bookmark' );
}
/** This filter is documented in wp-includes/bookmark.php */ /** This filter is documented in wp-includes/bookmark.php */
return apply_filters( 'get_bookmarks', $results, $r ); return apply_filters( 'get_bookmarks', $results, $r );

View File

@ -47,4 +47,27 @@ class Tests_Bookmark_GetBookmarks extends WP_UnitTestCase {
$this->assertEqualSets( $bookmarks, wp_list_pluck( $found2, 'link_id' ) ); $this->assertEqualSets( $bookmarks, wp_list_pluck( $found2, 'link_id' ) );
$this->assertTrue( $num_queries < $wpdb->num_queries ); $this->assertTrue( $num_queries < $wpdb->num_queries );
} }
/**
* @ticket 18356
*/
public function test_orderby_rand_should_not_be_cached() {
global $wpdb;
$bookmarks = self::factory()->bookmark->create_many( 2 );
$found1 = get_bookmarks( array(
'orderby' => 'rand',
) );
$num_queries = $wpdb->num_queries;
$found2 = get_bookmarks( array(
'orderby' => 'rand',
) );
// equal sets != same order
$this->assertEqualSets( $found1, $found2 );
$this->assertTrue( $num_queries < $wpdb->num_queries );
}
} }