WordPress.org

Make WordPress Core

Ticket #35566: 35566.diff

File 35566.diff, 11.3 KB (added by afercia, 15 months ago)
  • src/wp-includes/category-template.php

     
    659659 * be to return the top 45 tags in the tag cloud list.
    660660 *
    661661 * The 'topic_count_text' argument is a nooped plural from _n_noop() to generate the
    662  * text for the tooltip of the tag link.
     662 * text for the tag link count.
    663663 *
    664664 * The 'topic_count_text_callback' argument is a function, which given the count
    665  * of the posts with that tag returns a text for the tooltip of the tag link.
     665 * of the posts with that tag returns a text for the tag link count.
    666666 *
    667667 * The 'post_type' argument is used only when 'link' is set to 'edit'. It determines the post_type
    668668 * passed to edit.php for the popular tags edit links.
     
    671671 * should be used, because only one will be used and the other ignored, if they are both set.
    672672 *
    673673 * @since 2.3.0
     674 * @since 4.8.0 Added the `show_count` argument.
    674675 *
    675676 * @param array|string|null $args Optional. Override default arguments.
    676677 * @return void|array Generated tag cloud, only if no failures and 'array' is set for the 'format' argument.
     
    680681        $defaults = array(
    681682                'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 45,
    682683                'format' => 'flat', 'separator' => "\n", 'orderby' => 'name', 'order' => 'ASC',
    683                 'exclude' => '', 'include' => '', 'link' => 'view', 'taxonomy' => 'post_tag', 'post_type' => '', 'echo' => true
     684                'exclude' => '', 'include' => '', 'link' => 'view', 'taxonomy' => 'post_tag', 'post_type' => '', 'echo' => true,
     685                'show_count' => 0
    684686        );
    685687        $args = wp_parse_args( $args, $defaults );
    686688
     
    736738 *
    737739 * @todo Complete functionality.
    738740 * @since 2.3.0
     741 * @since 4.8.0 Added the `show_count` argument.
    739742 *
    740743 * @param array $tags List of tags.
    741744 * @param string|array $args {
     
    766769 *     @type int|bool $filter                     Whether to enable filtering of the final output
    767770 *                                                via {@see 'wp_generate_tag_cloud'}. Default 1|true.
    768771 *     @type string   $topic_count_text           Nooped plural text from _n_noop() to supply to
    769  *                                                tag tooltips. Default null.
     772 *                                                tag counts. Default null.
    770773 *     @type callable $topic_count_text_callback  Callback used to generate nooped plural text for
    771  *                                                tag tooltips based on the count. Default null.
     774 *                                                tag counts based on the count. Default null.
    772775 *     @type callable $topic_count_scale_callback Callback used to determine the tag count scaling
    773776 *                                                value. Default default_topic_count_scale().
     777 *     @type bool|int $show_count                 Whether to display the tag counts. Default 0. Accepts
     778 *                                                0, 1, or their bool equivalents.
    774779 * }
    775780 * @return string|array Tag cloud as a string or an array, depending on 'format' argument.
    776781 */
     
    780785                'format' => 'flat', 'separator' => "\n", 'orderby' => 'name', 'order' => 'ASC',
    781786                'topic_count_text' => null, 'topic_count_text_callback' => null,
    782787                'topic_count_scale_callback' => 'default_topic_count_scale', 'filter' => 1,
     788                'show_count' => 0
    783789        );
    784790
    785791        $args = wp_parse_args( $args, $defaults );
     
    790796                return $return;
    791797        }
    792798
    793         // Juggle topic count tooltips:
     799        // Juggle topic counts.
    794800        if ( isset( $args['topic_count_text'] ) ) {
    795801                // First look for nooped plural support via topic_count_text.
    796802                $translate_nooped_plural = $args['topic_count_text'];
     
    797803        } elseif ( ! empty( $args['topic_count_text_callback'] ) ) {
    798804                // Look for the alternative callback style. Ignore the previous default.
    799805                if ( $args['topic_count_text_callback'] === 'default_topic_count_text' ) {
    800                         $translate_nooped_plural = _n_noop( '%s topic', '%s topics' );
     806                        $translate_nooped_plural = _n_noop( '%s item', '%s items' );
    801807                } else {
    802808                        $translate_nooped_plural = false;
    803809                }
     
    806812                $translate_nooped_plural = _n_noop( $args['single_text'], $args['multiple_text'] );
    807813        } else {
    808814                // This is the default for when no callback, plural, or argument is passed in.
    809                 $translate_nooped_plural = _n_noop( '%s topic', '%s topics' );
     815                $translate_nooped_plural = _n_noop( '%s item', '%s items' );
    810816        }
    811817
    812818        /**
     
    861867                $font_spread = 1;
    862868        $font_step = $font_spread / $spread;
    863869
     870        $aria_label = false;
     871        /*
     872         * Determine whether to output an 'aria-label' attribute with the tag name and count.
     873         * When tags have a different font size, they visually convey an important information
     874         * that should be available to assistive technologies too. On the other hand, sometimes
     875         * themes set up the Tag Cloud to display all tags with the same font size (setting
     876         * the 'smallest' and 'largest' arguments to the same value).
     877         * In order to always serve the same content to all users, the 'aria-label' gets printed out:
     878         * - when tags have a different size
     879         * - when the tag count is displayed (for example when users check the checkbox in the
     880         *   Tag Cloud widget), regardless of the tags font size
     881         */
     882        if ( $args['show_count'] || 0 !== $font_spread ) {
     883                $aria_label = true;
     884        }
     885
    864886        // Assemble the data that will be used to generate the tag cloud markup.
    865887        $tags_data = array();
    866888        foreach ( $tags as $key => $tag ) {
     
    870892                $real_count = $real_counts[ $key ];
    871893
    872894                if ( $translate_nooped_plural ) {
    873                         $title = sprintf( translate_nooped_plural( $translate_nooped_plural, $real_count ), number_format_i18n( $real_count ) );
     895                        $formatted_count = sprintf( translate_nooped_plural( $translate_nooped_plural, $real_count ), number_format_i18n( $real_count ) );
    874896                } else {
    875                         $title = call_user_func( $args['topic_count_text_callback'], $real_count, $tag, $args );
     897                        $formatted_count = call_user_func( $args['topic_count_text_callback'], $real_count, $tag, $args );
    876898                }
    877899
    878900                $tags_data[] = array(
    879                         'id'         => $tag_id,
    880                         'url'        => '#' != $tag->link ? $tag->link : '#',
    881                         'role'       => '#' != $tag->link ? '' : ' role="button"',
    882                         'name'       => $tag->name,
    883                         'title'      => $title,
    884                         'slug'       => $tag->slug,
    885                         'real_count' => $real_count,
    886                         'class'      => 'tag-link-' . $tag_id,
    887                         'font_size'  => $args['smallest'] + ( $count - $min_count ) * $font_step,
     901                        'id'              => $tag_id,
     902                        'url'             => '#' != $tag->link ? $tag->link : '#',
     903                        'role'            => '#' != $tag->link ? '' : ' role="button"',
     904                        'name'            => $tag->name,
     905                        'formatted_count' => $formatted_count,
     906                        'slug'            => $tag->slug,
     907                        'real_count'      => $real_count,
     908                        'class'           => 'tag-cloud-link tag-link-' . $tag_id,
     909                        'font_size'       => $args['smallest'] + ( $count - $min_count ) * $font_step,
     910                        'aria_label'      => $aria_label ? sprintf( ' aria-label="%1$s (%2$s)"', esc_attr( $tag->name ), esc_attr( $formatted_count ) ) : '',
     911                        'show_count'      => $args['show_count'] ? '<span class="tag-link-count"> (' . $real_count . ')</span>' : '',
    888912                );
    889913        }
    890914
     
    899923
    900924        $a = array();
    901925
    902         // generate the output links array
     926        // Generate the output links array.
    903927        foreach ( $tags_data as $key => $tag_data ) {
    904928                $class = $tag_data['class'] . ' tag-link-position-' . ( $key + 1 );
    905                 $a[] = "<a href='" . esc_url( $tag_data['url'] ) . "'" . $tag_data['role'] . " class='" . esc_attr( $class ) . "' title='" . esc_attr( $tag_data['title'] ) . "' style='font-size: " . esc_attr( str_replace( ',', '.', $tag_data['font_size'] ) . $args['unit'] ) . ";'>" . esc_html( $tag_data['name'] ) . "</a>";
     929                $a[] = sprintf(
     930                        '<a href="%1$s"%2$s class="%3$s" style="font-size: %4$s;"%5$s>%6$s%7$s</a>',
     931                        esc_url( $tag_data['url'] ),
     932                        $tag_data['role'],
     933                        esc_attr( $class ),
     934                        esc_attr( str_replace( ',', '.', $tag_data['font_size'] ) . $args['unit'] ),
     935                        $tag_data['aria_label'],
     936                        esc_html( $tag_data['name'] ),
     937                        $tag_data['show_count']
     938                );
    906939        }
    907940
    908941        switch ( $args['format'] ) {
     
    910943                        $return =& $a;
    911944                        break;
    912945                case 'list' :
    913                         $return = "<ul class='wp-tag-cloud'>\n\t<li>";
     946                        /*
     947                         * Force role="list", as some browsers (sic: Safari 10) don't expose to assistive
     948                         * technologies the default role when the list is styled with `list-style: none`.
     949                         * Note: this is redundant but doesn't harm.
     950                         */
     951                        $return = "<ul class='wp-tag-cloud' role='list'>\n\t<li>";
    914952                        $return .= join( "</li>\n\t<li>", $a );
    915953                        $return .= "</li>\n</ul>\n";
    916954                        break;
  • src/wp-includes/widgets/class-wp-widget-tag-cloud.php

     
    5353                        }
    5454                }
    5555
     56                $show_count = ! empty( $instance['count'] ) ? '1' : '0';
     57
    5658                /**
    5759                 * Filters the taxonomy used in the Tag Cloud widget.
    5860                 *
     
    6466                 * @param array $args Args used for the tag cloud widget.
    6567                 */
    6668                $tag_cloud = wp_tag_cloud( apply_filters( 'widget_tag_cloud_args', array(
    67                         'taxonomy' => $current_taxonomy,
    68                         'echo' => false
     69                        'taxonomy'   => $current_taxonomy,
     70                        'echo'       => false,
     71                        'show_count' => $show_count
    6972                ) ) );
    7073
    7174                if ( empty( $tag_cloud ) ) {
     
    102105        public function update( $new_instance, $old_instance ) {
    103106                $instance = array();
    104107                $instance['title'] = sanitize_text_field( $new_instance['title'] );
     108                $instance['count'] = ! empty( $new_instance['count'] ) ? 1 : 0;
    105109                $instance['taxonomy'] = stripslashes($new_instance['taxonomy']);
    106110                return $instance;
    107111        }
     
    117121        public function form( $instance ) {
    118122                $current_taxonomy = $this->_get_current_taxonomy($instance);
    119123                $title_id = $this->get_field_id( 'title' );
     124                $count = isset( $instance['count'] ) ? (bool) $instance['count'] : false;
    120125                $instance['title'] = ! empty( $instance['title'] ) ? esc_attr( $instance['title'] ) : '';
    121126
    122127                echo '<p><label for="' . $title_id .'">' . __( 'Title:' ) . '</label>
     
    128133                $name = $this->get_field_name( 'taxonomy' );
    129134                $input = '<input type="hidden" id="' . $id . '" name="' . $name . '" value="%s" />';
    130135
     136                $count_checkbox = sprintf(
     137                        '<p><input type="checkbox" class="checkbox" id="%1$s" name="%2$s"%3$s /> <label for="%1$s">%4$s</label></p>',
     138                        $this->get_field_id( 'count' ),
     139                        $this->get_field_name( 'count' ),
     140                        checked( $count, true, false ),
     141                        __( 'Show tag counts' )
     142                );
     143
    131144                switch ( count( $taxonomies ) ) {
    132145
    133146                // No tag cloud supporting taxonomies found, display error message
     
    136149                        printf( $input, '' );
    137150                        break;
    138151
    139                 // Just a single tag cloud supporting taxonomy found, no need to display options
     152                // Just a single tag cloud supporting taxonomy found, no need to display a select.
    140153                case 1:
    141154                        $keys = array_keys( $taxonomies );
    142155                        $taxonomy = reset( $keys );
    143156                        printf( $input, esc_attr( $taxonomy ) );
     157                        echo $count_checkbox;
    144158                        break;
    145159
    146                 // More than one tag cloud supporting taxonomy found, display options
     160                // More than one tag cloud supporting taxonomy found, display a select.
    147161                default:
    148162                        printf(
    149163                                '<p><label for="%1$s">%2$s</label>' .
     
    162176                                );
    163177                        }
    164178
    165                         echo '</select></p>';
     179                        echo '</select></p>' . $count_checkbox;
    166180                }
    167181        }
    168182