PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 4.9.2
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v4.9.2
4.9.2 4.9.1 4.9.0 4.8.2 4.8.1 4.8.0 4.7.0 4.6.2 4.6.1 4.6.0 4.5.6 4.5.5 4.5.4 4.5.3 4.5.2 4.5.1 4.5.0 4.4.1 4.4.0 3.3.4 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 All 200 releases
← All changes | includes/Core/Glossaries.php +17 -6 4.5.04.9.2 View file →
@@ -1,8 +1,16 @@
1 1 <?php
2 +namespace WPDeveloper\BetterDocs\Core;
2 3
3 -namespace WPDeveloper\BetterDocs\Core;
4 +if ( ! defined( 'ABSPATH' ) ) {
5 + exit;
6 +}
4 7
8 +// Glossary-by-term and glossary admin filters require tax_query and meta_key.
9 +// phpcs:disable WordPress.DB.SlowDBQuery.slow_db_query_tax_query
10 +// phpcs:disable WordPress.DB.SlowDBQuery.slow_db_query_meta_query
11 +// phpcs:disable WordPress.DB.SlowDBQuery.slow_db_query_meta_key
12 +
5 13 use WP_Query;
6 14 use WP_Error;
7 15 use WPDeveloper\BetterDocs\Utils\Base;
8 16 use WPDeveloper\BetterDocs\Utils\Helper;
@@ -115,11 +123,11 @@
115 123 public function ensure_glossaries_have_status() {
116 124 // Run this every time in admin to ensure status is properly set
117 125 // Get all glossaries terms
118 126 $all_terms = get_terms( array(
119 - 'taxonomy' => 'glossaries',
120 - 'hide_empty' => false,
121 - 'suppress_filters' => true // Bypass language filtering
127 + 'taxonomy' => 'glossaries',
128 + 'hide_empty' => false,
129 + 'suppress_filters' => true, // phpcs:ignore WordPressVIPMinimum.Hooks.PreGetPosts.PreGetPosts,WordPressVIPMinimum.Performance.WPQueryParams.SuppressFilters_suppress_filters -- intentional WPML/Polylang language bypass.
122 130 ) );
123 131
124 132 if ( ! empty( $all_terms ) && ! is_wp_error( $all_terms ) ) {
125 133 foreach ( $all_terms as $term ) {
@@ -180,13 +188,14 @@
180 188 */
181 189 private function get_max_taxonomy_order( $tax_slug ) {
182 190 global $wpdb;
183 191
192 + // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- live max-order needed when assigning new terms; cache would be stale.
184 193 $max_term_order = $wpdb->get_col(
185 194 $wpdb->prepare(
186 195 "SELECT MAX( CAST( tm.meta_value AS UNSIGNED ) )
187 196 FROM $wpdb->terms t
188 - JOIN $wpdb->term_taxonomy tt ON t.term_id = tt.term_id AND tt.taxonomy = '%s'
197 + JOIN $wpdb->term_taxonomy tt ON t.term_id = tt.term_id AND tt.taxonomy = %s
189 198 JOIN $wpdb->termmeta tm ON tm.term_id = t.term_id WHERE tm.meta_key = 'order'",
190 199 $tax_slug
191 200 )
192 201 );
@@ -752,8 +761,9 @@
752 761 $taxonomy_objects = get_terms( $term_args );
753 762
754 763 if ( $taxonomy_objects && ! is_wp_error( $taxonomy_objects ) ) :
755 764 foreach ( $taxonomy_objects as $term ) :
765 + // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query -- core glossary-by-term query; tax filtering is required functionality.
756 766 $args = [
757 767 'post_type' => 'betterdocs_faq',
758 768 'post_status' => 'publish',
759 769 'post_per_page' => -1,
@@ -859,9 +869,9 @@
859 869
860 870 // Get all glossaries terms without language filtering
861 871 $all_args = $args;
862 872 unset( $all_args['lang'] );
863 - $all_args['suppress_filters'] = true; // Bypass all filters including language ones
873 + $all_args['suppress_filters'] = true; // phpcs:ignore WordPressVIPMinimum.Hooks.PreGetPosts.PreGetPosts,WordPressVIPMinimum.Performance.WPQueryParams.SuppressFilters_suppress_filters -- admin glossary management requires bypassing all language filters.
864 874
865 875 $all_terms = get_terms( $all_args );
866 876
867 877 // Re-add the filter for future calls
@@ -906,8 +916,9 @@
906 916
907 917 public function glossaries_orderby_meta( $args, $request ) {
908 918 if ( $args['taxonomy'] === 'glossaries' ) {
909 919 $args['orderby'] = 'meta_value_num';
920 + // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key -- ordering by status meta is required UX.
910 921 $args['meta_key'] = 'status';
911 922 }
912 923 return $args;
913 924 }