WordPress.org

Make WordPress Core

Ticket #37975: 37975.php

File 37975.php, 2.4 KB (added by ivankk, 3 years ago)

work around code

Line 
1<?php
2add_filter( 'get_terms', __NAMESPACE__ . '\add_descriptions_to_tag_search', 10, 4 );
3add_filter( 'get_terms_args', __NAMESPACE__ . '\get_terms_args', 10, 2 );
4add_action( 'pre_post_tax_input', __NAMESPACE__ . '\pre_post_tax_input', 10, 2 );
5
6/**
7 * Change the tags from being just the tag name to id + name + description.
8 * Must be used with the get_terms_args filter.
9 *
10 * @param $terms
11 * @param $taxonomies
12 * @param $args
13 * @param $term_query
14 *
15 * @return array of strings for dropdown.
16 */
17function add_descriptions_to_tag_search( $terms, $taxonomies, $args, $term_query) {
18    if ( ! ( is_tag_search() && 'post_tag' === $taxonomies[0] ) ) {
19        return $terms;
20    }
21
22    $term_strings = array();
23    foreach( $terms as $term ) {
24        $term_string = "<span style='display:none;'>$term->term_id:</span><strong>$term->name </strong>";
25        if ( $term->description ) {
26             $term_string .= "<br /><em>$term->description</em>";
27        }
28
29        $term_strings[] = $term_string;
30    }
31}
32
33/**
34 * For a tag search post_tag get_terms call, override the behaviour from $args['fields'] = 'name' to 'all',
35 * must be combined with @see add_descriptions_to_tag_search() above to work correctly.
36 * @param $args
37 * @param $taxonomies
38 *
39 * @return mixed
40 */
41function get_terms_args( $args, $taxonomies ) {
42    if ( ! ( is_tag_search() && 'post_tag' === $taxonomies[0] ) ) {
43        return $args;
44    }
45    $args['fields'] = 'all';
46    return $args;
47}
48
49function pre_post_tax_input( $tax_input ) {
50    if ( defined( 'DOING_CRON' ) || ( defined('WP_CLI') && WP_CLI ) ) {
51        return;
52    }
53
54
55    if ( isset( $tax_input['post_tag'] ) ) {
56        $incoming_terms = $tax_input['post_tag'];
57
58        foreach ( $incoming_terms as $term ) {
59            // If the term already exists, WP sends just the ID. If it is new, the term name is passed.
60            if ( ! is_int( $term ) ) {
61                $tag_id = absint( strtok( $term, ':') );
62                if ( 0 !== $tag_id ) {
63                    $updated_terms[] = $tag_id; // We just use the ID from the tag dropdown
64                } else {
65                    $updated_terms[] = $term; // For anywhere we haven't overriddent the default behaviour.
66                }
67            } else {
68                $updated_terms[] = $term;
69            }
70        }
71
72        $tax_input['post_tag'] = $updated_terms;
73    }
74
75    return $tax_input;
76}