From 04b0a0f77c9c95d8e750c5ebdd3e4cdb7916d4dc Mon Sep 17 00:00:00 2001 From: Adam Silverstein Date: Tue, 30 Jan 2018 00:16:37 +0000 Subject: [PATCH] Taxonomy: Use REST API for ajax tag search. Deprecate wp_ajax_ajax_tag_search and switch to using the REST API when searching tags in the tags meta box. Props nacin, chriscct7, afercia, swissspidy, jnylen0, rmccue, ryelle. Fixes #38922. git-svn-id: https://develop.svn.wordpress.org/trunk@42614 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/ajax-actions.php | 63 -------------------------- src/wp-admin/includes/deprecated.php | 58 ++++++++++++++++++++++++ src/wp-admin/js/tags-suggest.js | 32 +++---------- src/wp-includes/script-loader.php | 11 +++++ 4 files changed, 76 insertions(+), 88 deletions(-) diff --git a/src/wp-admin/includes/ajax-actions.php b/src/wp-admin/includes/ajax-actions.php index 8ced5d335a..8861e154f0 100644 --- a/src/wp-admin/includes/ajax-actions.php +++ b/src/wp-admin/includes/ajax-actions.php @@ -99,69 +99,6 @@ function wp_ajax_fetch_list() { wp_die( 0 ); } -/** - * Ajax handler for tag search. - * - * @since 3.1.0 - */ -function wp_ajax_ajax_tag_search() { - if ( ! isset( $_GET['tax'] ) ) { - wp_die( 0 ); - } - - $taxonomy = sanitize_key( $_GET['tax'] ); - $tax = get_taxonomy( $taxonomy ); - if ( ! $tax ) { - wp_die( 0 ); - } - - if ( ! current_user_can( $tax->cap->assign_terms ) ) { - wp_die( -1 ); - } - - $s = wp_unslash( $_GET['q'] ); - - $comma = _x( ',', 'tag delimiter' ); - if ( ',' !== $comma ) { - $s = str_replace( $comma, ',', $s ); - } - if ( false !== strpos( $s, ',' ) ) { - $s = explode( ',', $s ); - $s = $s[ count( $s ) - 1 ]; - } - $s = trim( $s ); - - /** - * Filters the minimum number of characters required to fire a tag search via Ajax. - * - * @since 4.0.0 - * - * @param int $characters The minimum number of characters required. Default 2. - * @param WP_Taxonomy $tax The taxonomy object. - * @param string $s The search term. - */ - $term_search_min_chars = (int) apply_filters( 'term_search_min_chars', 2, $tax, $s ); - - /* - * Require $term_search_min_chars chars for matching (default: 2) - * ensure it's a non-negative, non-zero integer. - */ - if ( ( $term_search_min_chars == 0 ) || ( strlen( $s ) < $term_search_min_chars ) ) { - wp_die(); - } - - $results = get_terms( - $taxonomy, array( - 'name__like' => $s, - 'fields' => 'names', - 'hide_empty' => false, - ) - ); - - echo join( $results, "\n" ); - wp_die(); -} - /** * Ajax handler for compression testing. * diff --git a/src/wp-admin/includes/deprecated.php b/src/wp-admin/includes/deprecated.php index e65fe5a79c..f6e249ca5e 100644 --- a/src/wp-admin/includes/deprecated.php +++ b/src/wp-admin/includes/deprecated.php @@ -1514,3 +1514,61 @@ function options_permalink_add_js() { cap->assign_terms ) ) { + wp_die( -1 ); + } + + $s = wp_unslash( $_GET['q'] ); + + $comma = _x( ',', 'tag delimiter' ); + if ( ',' !== $comma ) { + $s = str_replace( $comma, ',', $s ); + } + if ( false !== strpos( $s, ',' ) ) { + $s = explode( ',', $s ); + $s = $s[ count( $s ) - 1 ]; + } + $s = trim( $s ); + + /** This filter is documented in wp-includes/script-loader.php */ + $term_search_min_chars = (int) apply_filters( 'term_search_min_chars', 2, $tax, $s ); + + /* + * Require $term_search_min_chars chars for matching (default: 2) + * ensure it's a non-negative, non-zero integer. + */ + if ( ( $term_search_min_chars == 0 ) || ( strlen( $s ) < $term_search_min_chars ) ) { + wp_die(); + } + + $results = get_terms( + $taxonomy, array( + 'name__like' => $s, + 'fields' => 'names', + 'hide_empty' => false, + ) + ); + + echo join( $results, "\n" ); + wp_die(); +} diff --git a/src/wp-admin/js/tags-suggest.js b/src/wp-admin/js/tags-suggest.js index 6465cc9959..0505988302 100644 --- a/src/wp-admin/js/tags-suggest.js +++ b/src/wp-admin/js/tags-suggest.js @@ -53,33 +53,15 @@ term = getLast( request.term ); - $.get( window.ajaxurl, { - action: 'ajax-tag-search', - tax: taxonomy, - q: term + $.get( window.tagsSuggestL10n.restURL, { + _fields: [ 'id', 'name' ], + taxonomy: taxonomy, + search: term } ).always( function() { $element.removeClass( 'ui-autocomplete-loading' ); // UI fails to remove this sometimes? } ).done( function( data ) { - var tagName; - var tags = []; - - if ( data ) { - data = data.split( '\n' ); - - for ( tagName in data ) { - var id = ++tempID; - - tags.push({ - id: id, - name: data[tagName] - }); - } - - cache = tags; - response( tags ); - } else { - response( tags ); - } + cache = data; + response( data ); } ); last = request.term; @@ -118,7 +100,7 @@ close: function() { $element.attr( 'aria-expanded', 'false' ); }, - minLength: 2, + minLength: window.tagsSuggestL10n.minChars, position: { my: 'left top+2', at: 'left bottom', diff --git a/src/wp-includes/script-loader.php b/src/wp-includes/script-loader.php index e0b63f44d3..98a5a0d1cc 100644 --- a/src/wp-includes/script-loader.php +++ b/src/wp-includes/script-loader.php @@ -726,6 +726,17 @@ function wp_default_scripts( &$scripts ) { 'termSelected' => __( 'Term selected.' ), 'termAdded' => __( 'Term added.' ), 'termRemoved' => __( 'Term removed.' ), + 'restURL' => rest_url( '/wp/v2/tags' ), + + /** + * Filters the minimum number of characters required to fire a tag search via Ajax. + * + * Previous to 4.8.0, this filter passed taxonomy and search context parameters. + * @since 4.0.0 + * + * @param int $characters The minimum number of characters required. Default 2. + */ + 'minChars' => (int) apply_filters( 'term_search_min_chars', 2 ), ) );