summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/jetpack/jetpack_vendor/automattic/jetpack-search/src/class-stats.php')
-rw-r--r--plugins/jetpack/jetpack_vendor/automattic/jetpack-search/src/class-stats.php89
1 files changed, 89 insertions, 0 deletions
diff --git a/plugins/jetpack/jetpack_vendor/automattic/jetpack-search/src/class-stats.php b/plugins/jetpack/jetpack_vendor/automattic/jetpack-search/src/class-stats.php
new file mode 100644
index 00000000..1dac29dc
--- /dev/null
+++ b/plugins/jetpack/jetpack_vendor/automattic/jetpack-search/src/class-stats.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Get search stats for use in the wp-admin dashboard.
+ *
+ * @package automattic/jetpack-search
+ */
+
+namespace Automattic\Jetpack\Search;
+
+use Automattic\Jetpack\Connection\Client;
+use Jetpack_Options;
+
+/**
+ * Search stats (e.g. post count, post type breakdown)
+ */
+class Stats {
+ const CACHE_EXPIRY = 5 * MINUTE_IN_SECONDS;
+ const CACHE_GROUP = 'jetpack_search';
+ const COUNT_ESTIMATE_CACHE_KEY = 'count_estimate';
+
+ /**
+ * Get stats from the WordPress.com API for the current blog ID.
+ */
+ public function get_stats_from_wpcom() {
+ $blog_id = Jetpack_Options::get_option( 'id' );
+
+ if ( ! is_numeric( $blog_id ) ) {
+ return null;
+ }
+
+ $response = Client::wpcom_json_api_request_as_blog(
+ '/sites/' . (int) $blog_id . '/jetpack-search/stats',
+ '2',
+ array(),
+ null,
+ 'wpcom'
+ );
+
+ return $response;
+ }
+
+ /**
+ * Estimate record counts via a local database query.
+ */
+ public static function estimate_count() {
+ $cached_value = wp_cache_get( self::COUNT_ESTIMATE_CACHE_KEY, self::CACHE_GROUP );
+ if ( false !== $cached_value ) {
+ return $cached_value;
+ }
+
+ global $wpdb;
+ $indexable_statuses = get_post_stati( array( 'public' => true ) );
+ $unindexable_post_types = array_merge(
+ // Explicitly exclude various post types registered by plugins.
+ array(
+ 'elementor_library', // Used by Elementor.
+ 'jp_sitemap', // Used by Jetpack.
+ 'product_variation', // Used by Woocommerce.
+ 'redirect_rule', // Used by the Safe Redirect plugin.
+ 'reply', // Used by bbpress.
+ 'scheduled-action', // Used by Woocommerce.
+ ),
+ get_post_types(
+ array(
+ 'exclude_from_search' => true,
+ 'public' => false,
+ ),
+ 'names',
+ 'or'
+ )
+ );
+
+ $prep_for_query = function ( $string ) use ( $wpdb ) {
+ // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.QuotedSimplePlaceholder -- This is used to sanitize post type names.
+ return $wpdb->prepare( "'%s'", $string );
+ };
+
+ $statuses_list = implode( ',', array_map( $prep_for_query, $indexable_statuses ) );
+ $post_types_list = implode( ',', array_map( $prep_for_query, $unindexable_post_types ) );
+
+ $count = (int) $wpdb->get_var(
+ // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- This is properly prepared, but the query is constructed using variables.
+ "SELECT COUNT(ID) FROM {$wpdb->posts} WHERE post_status IN ($statuses_list) AND post_type NOT IN ($post_types_list)"
+ );
+
+ wp_cache_set( self::COUNT_ESTIMATE_CACHE_KEY, $count, self::CACHE_GROUP, self::CACHE_EXPIRY );
+ return $count;
+ }
+}