| @@ -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 | } |