From 66952daceb5ca887e3c197549e2452c211488de9 Mon Sep 17 00:00:00 2001 From: Rebecca Hum Date: Tue, 12 Dec 2023 23:36:33 -0700 Subject: [PATCH 1/2] In Terms Indexable`query_db`, for term count, use `wp_count_terms()` instead of `WP_Term_Query` to avoid `_prime_term_caches` This is because on a DB with a lot of terms, calling `prime_term_caches` triggers an expensive, unnecessary query that isn't required for the ultimate term count. Also, add `hierarchical` => `false` for performance, otherwise it performs a no limit query --- includes/classes/Indexable/Term/Term.php | 27 +++++++++--------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/includes/classes/Indexable/Term/Term.php b/includes/classes/Indexable/Term/Term.php index 4147f57b7b..51c652e15a 100644 --- a/includes/classes/Indexable/Term/Term.php +++ b/includes/classes/Indexable/Term/Term.php @@ -620,14 +620,14 @@ public function prepare_document( $term_id ) { * @return array */ public function query_db( $args ) { - $defaults = [ - 'number' => $this->get_bulk_items_per_page(), - 'offset' => 0, - 'orderby' => 'id', - 'order' => 'desc', - 'taxonomy' => $this->get_indexable_taxonomies(), - 'hide_empty' => false, + 'number' => $this->get_bulk_items_per_page(), + 'offset' => 0, + 'orderby' => 'id', + 'order' => 'desc', + 'taxonomy' => $this->get_indexable_taxonomies(), + 'hide_empty' => false, + 'hierarchical' => false, ]; if ( isset( $args['per_page'] ) ) { @@ -650,23 +650,16 @@ public function query_db( $args ) { unset( $all_query_args['offset'] ); unset( $all_query_args['fields'] ); - /** - * This just seems so inefficient. - * - * @todo Better way to do this? - */ - /** * Filter database arguments for term count query * * @hook ep_term_all_query_db_args - * @param {array} $args Query arguments based to WP_Term_Query + * @param {array} $args Query arguments based to `wp_count_terms()` * @since 3.4 * @return {array} New arguments */ - $all_query = new WP_Term_Query( apply_filters( 'ep_term_all_query_db_args', $all_query_args, $args ) ); - - $total_objects = count( $all_query->terms ); + $total_objects = wp_count_terms( apply_filters( 'ep_term_all_query_db_args', $all_query_args, $args ) ); + $total_objects = ! is_wp_error( $total_objects ) ? (int) $total_objects : 0; if ( ! empty( $args['offset'] ) ) { if ( (int) $args['offset'] >= $total_objects ) { From de5b2b372ca8e4121f70d7a26a4c19d048a6b8e2 Mon Sep 17 00:00:00 2001 From: Rebecca Hum Date: Thu, 4 Jan 2024 09:25:18 -0700 Subject: [PATCH 2/2] Add parameters to disable caching --- includes/classes/Indexable/Term/Term.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/includes/classes/Indexable/Term/Term.php b/includes/classes/Indexable/Term/Term.php index 51c652e15a..df11f6b619 100644 --- a/includes/classes/Indexable/Term/Term.php +++ b/includes/classes/Indexable/Term/Term.php @@ -621,13 +621,15 @@ public function prepare_document( $term_id ) { */ public function query_db( $args ) { $defaults = [ - 'number' => $this->get_bulk_items_per_page(), - 'offset' => 0, - 'orderby' => 'id', - 'order' => 'desc', - 'taxonomy' => $this->get_indexable_taxonomies(), - 'hide_empty' => false, - 'hierarchical' => false, + 'number' => $this->get_bulk_items_per_page(), + 'offset' => 0, + 'orderby' => 'id', + 'order' => 'desc', + 'taxonomy' => $this->get_indexable_taxonomies(), + 'hide_empty' => false, + 'hierarchical' => false, + 'update_term_meta_cache' => false, + 'cache_results' => false, ]; if ( isset( $args['per_page'] ) ) {