Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

My Jetpack: Fix - Update getting raw post type count #40635

Merged
merged 6 commits into from
Dec 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Significance: patch
Type: fixed

Fix an issue where high posts counts would cause backend issues for the get_raw_post_type_breakdown function used in My Jetpack. Sites with over 100,000 posts can now have this query managed remotely.
44 changes: 43 additions & 1 deletion projects/packages/my-jetpack/src/products/class-search-stats.php
Original file line number Diff line number Diff line change
Expand Up @@ -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 = 1e5;

/**
* Get stats from the WordPress.com API for the current blog ID.
Expand All @@ -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.
*/
Expand Down Expand Up @@ -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;
Expand All @@ -137,6 +158,27 @@ 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();
$search_stats->queue_post_count_query_from_wpcom();
$wpcom_stats = json_decode( wp_remote_retrieve_body( $search_stats->get_stats_from_wpcom() ), true );
if ( ! empty( $wpcom_stats['raw_post_type_breakdown'] ) ) {
$results = $wpcom_stats['raw_post_type_breakdown'];
wp_cache_set( self::POST_TYPE_BREAKDOWN_CACHE_KEY, $results, self::CACHE_GROUP, self::CACHE_EXPIRY );
return $results;
} else {
return array();
}
}

$query = "SELECT post_type, post_status, COUNT( * ) AS num_posts
FROM {$wpdb->posts}
WHERE post_password = ''
Expand Down
Loading