From 124515dfbcb23356692b01dc7fc7b274b37a4e20 Mon Sep 17 00:00:00 2001 From: Oli I Date: Mon, 16 Dec 2024 17:00:15 -0600 Subject: [PATCH] Update raw post type breakdown for sites with high post count Updating the function get_raw_post_type_breakdown for sites with high post counts as the query can cause backend issues for sites with a lot of post. If the sites total post count exceeds a million posts the query will be handled remotely and the results of a remote request used for My Jetpack --- .../src/products/class-search-stats.php | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/projects/packages/my-jetpack/src/products/class-search-stats.php b/projects/packages/my-jetpack/src/products/class-search-stats.php index 8d363a3bc82e0..816824dab59bc 100644 --- a/projects/packages/my-jetpack/src/products/class-search-stats.php +++ b/projects/packages/my-jetpack/src/products/class-search-stats.php @@ -36,6 +36,8 @@ class Search_Stats { const CACHE_EXPIRY = 1 * MINUTE_IN_SECONDS; const CACHE_GROUP = 'jetpack_search'; const POST_TYPE_BREAKDOWN_CACHE_KEY = 'post_type_break_down'; + const TOTAL_POSTS_COUNT_CACHE_KEY = 'total-post-count'; + const POST_COUNT_QUERY_LIMIT = 1e6; /** * Get stats from the WordPress.com API for the current blog ID. @@ -58,6 +60,25 @@ public function get_stats_from_wpcom() { return $response; } + /** + * Queue querying the post type breakdown from WordPress.com API for the current blog ID. + */ + public function queue_post_count_query_from_wpcom() { + $blog_id = Jetpack_Options::get_option( 'id' ); + + if ( ! is_numeric( $blog_id ) ) { + return null; + } + + Client::wpcom_json_api_request_as_blog( + '/sites/' . (int) $blog_id . '/jetpack-search/queue-post-count', + '2', + array(), + null, + 'wpcom' + ); + } + /** * Estimate record counts via a local database query. */ @@ -127,7 +148,7 @@ public static function get_post_type_breakdown_with( $raw_posts_counts, $indexab } /** - * Get raw post type breakdown from the database. + * Get raw post type breakdown from the database or a remote request if posts count is high. */ protected static function get_raw_post_type_breakdown() { global $wpdb; @@ -137,6 +158,28 @@ protected static function get_raw_post_type_breakdown() { return $results; } + $total_posts_count = wp_cache_get( self::TOTAL_POSTS_COUNT_CACHE_KEY, self::CACHE_GROUP ); + if ( false === $total_posts_count ) { + // phpcs:ignore WordPress.DB.DirectDatabaseQuery */ + $total_posts_counts = $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->posts}" ); + wp_cache_set( self::TOTAL_POSTS_COUNT_CACHE_KEY, $total_posts_counts, self::CACHE_GROUP, self::CACHE_EXPIRY ); + } + + // Get post type breakdown from a remote request if the post count is high + if ( $total_posts_count > self::POST_COUNT_QUERY_LIMIT ) { + $search_stats = new Search_Stats(); + $wpcom_stats = json_decode( wp_remote_retrieve_body( $search_stats->get_stats_from_wpcom() ), true ); + $wpcom_raw_post_type_breakdown = $wpcom_stats['raw_post_type_breakdown']; + if ( $wpcom_raw_post_type_breakdown ) { + $results = $wpcom_raw_post_type_breakdown; + wp_cache_set( self::POST_TYPE_BREAKDOWN_CACHE_KEY, $results, self::CACHE_GROUP, self::CACHE_EXPIRY ); + return $results; + } else { + $search_stats->queue_post_count_query_from_wpcom(); + return array(); + } + } + $query = "SELECT post_type, post_status, COUNT( * ) AS num_posts FROM {$wpdb->posts} WHERE post_password = ''