WordPress Quotes Collection patch update
This is an update to the WordPress Quotes Collection plugin, which uses “ORDER BY RAND().” This is a Bad Idea, but there is a better way that isn’t too ugly. This is a partial fix. A complete fix involves a helper table and a database trigger, which I am just too lazy to maintain as a branch of an uncommented PHP script.
The problem: If you have a very large number of quotes, and use the “random” feature, your quotes collection plugin is eating randomness very rapidly for each page load. This is bad.
The solution: This patch replaces the quotescollection_get_quote()Â function with a random function that retrieves exactly one random number per fetch. It has only been tested in my configuration, with Quotes Collection 1.5.1:
function quotescollection_get_quote($condition = '', $random = 1, $current = 0) {    global $wpdb;    $sql = "SELECT quote_id, quote, author, source       FROM " . $wpdb->prefix . "quotescollection";    if(!$random) {       if ($condition)          $sql .= $condition;       if($current)          $sql .= " AND quote_id < {$current}";       $sql .= " ORDER BY quote_id DESC";    }    else {                // Select random id. Conserves randomness, but will be less random if you                // delete quotes.                // See: http://jan.kneschke.de/projects/mysql/order-by-rand/       $sql .= " JOIN (SELECT CEIL(RAND() * (SELECT MAX(quote_id)                                FROM " . $wpdb->prefix . "quotescollection )) AS id)                               AS myrand";       if ($condition) {          $sql .= $condition;          $sql .= " AND ";       }       else {          $sql .= " WHERE ";       }                $sql .= "quote_id >= myrand.id";       // This random method requires LIMIT 1, which is appended below already    }    $sql .= " LIMIT 1";    $random_quote = $wpdb->get_row($sql, ARRAY_A);    if ( empty($random_quote) ) {       if(!$random && $current)          return quotescollection_get_quote($condition, 0, 0);       else          return 0;    }    else       return $random_quote; }
My previous random fix used count(*) which I have now discovered can be just as slow, for entirely different reasons. So I won’t be doing that again. :)
Peace, love, and high quality randomness to you all.