WordPress.org

Make WordPress Core

Ticket #6015: 6015.tags.2.diff

File 6015.tags.2.diff, 3.8 KB (added by DD32, 10 years ago)

re-implements tag cloud changes. Orderby's working. Warning: $number is actually implemented now, Default tag cloud is set for 45-tags maximum

  • wp-includes/category-template.php

     
    350350        if ( empty( $tags ) )
    351351                return;
    352352
     353        foreach ( $tags as $key => $tag ) {
     354                $link = get_tag_link( $tag->term_id );
     355                if ( is_wp_error( $link ) )
     356                        return false;
     357
     358                $tags[ $key ]->link = $link;
     359                $tags[ $key ]->id = $tag->term_id;
     360        }
     361
    353362        $return = wp_generate_tag_cloud( $tags, $args ); // Here's where those top tags get sorted according to $args
    354363
    355         if ( is_wp_error( $return ) )
    356                 return false;
    357 
    358364        $return = apply_filters( 'wp_tag_cloud', $return, $args );
    359365
    360366        if ( 'array' == $args['format'] )
     
    377383function wp_generate_tag_cloud( $tags, $args = '' ) {
    378384        global $wp_rewrite;
    379385        $defaults = array(
    380                 'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 45,
    381                 'format' => 'flat', 'orderby' => 'name', 'order' => 'ASC'
     386                'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 0,
     387                'format' => 'flat', 'orderby' => 'name', 'order' => 'ASC',
     388                'single_text' => '%d topic', 'multiple_text' => '%d topics'
    382389        );
    383390        $args = wp_parse_args( $args, $defaults );
    384391        extract( $args );
    385392
    386393        if ( empty( $tags ) )
    387394                return;
    388         $counts = $tag_links = array();
    389         foreach ( (array) $tags as $tag ) {
    390                 $counts[$tag->name] = $tag->count;
    391                 $tag_links[$tag->name] = get_tag_link( $tag->term_id );
    392                 if ( is_wp_error( $tag_links[$tag->name] ) )
    393                         return $tag_links[$tag->name];
    394                 $tag_ids[$tag->name] = $tag->term_id;
     395
     396        // SQL cannot save you; this is a second (potentially different) sort on a subset of data.
     397        if ( 'name' == $orderby )
     398                uasort( $tags, create_function('$a, $b', 'return strnatcasecmp($a->name, $b->name);') );
     399        else
     400                uasort( $tags, create_function('$a, $b', 'return ($a->count < $b->count);') );
     401
     402        if ( 'DESC' == $order )
     403                $tags = array_reverse( $tags, true );
     404        elseif ( 'RAND' == $order ) {
     405                $keys = array_rand( $tags, count( $tags ) );
     406                foreach ( $keys as $key )
     407                        $temp[$key] = $tags[$key];
     408                $tags = $temp;
     409                unset( $temp );
    395410        }
    396411
     412        if ( $number > 0 )
     413                $tags = array_slice($tags, 0, $number);
     414
     415        $counts = array();
     416        foreach ( (array) $tags as $key => $tag )
     417                $counts[ $key ] = $tag->count;
     418
    397419        $min_count = min( $counts );
    398420        $spread = max( $counts ) - $min_count;
    399421        if ( $spread <= 0 )
     
    403425                $font_spread = 1;
    404426        $font_step = $font_spread / $spread;
    405427
    406         // SQL cannot save you; this is a second (potentially different) sort on a subset of data.
    407         if ( 'name' == $orderby )
    408                 uksort( $counts, 'strnatcasecmp' );
    409         else
    410                 asort( $counts );
    411 
    412         if ( 'DESC' == $order )
    413                 $counts = array_reverse( $counts, true );
    414         elseif ( 'RAND' == $order ) {
    415                 $keys = array_rand( $counts, count( $counts ) );
    416                 foreach ( $keys as $key )
    417                         $temp[$key] = $counts[$key];
    418                 $counts = $temp;
    419                 unset( $temp );
    420         }
    421 
    422428        $a = array();
    423429
    424430        $rel = ( is_object( $wp_rewrite ) && $wp_rewrite->using_permalinks() ) ? ' rel="tag"' : '';
    425431
    426         foreach ( $counts as $tag => $count ) {
    427                 $tag_id = $tag_ids[$tag];
    428                 $tag_link = clean_url($tag_links[$tag]);
    429                 $a[] = "<a href='$tag_link' class='tag-link-$tag_id' title='" . attribute_escape( sprintf( __ngettext('%d topic','%d topics',$count), $count ) ) . "'$rel style='font-size: " .
     432        foreach ( $tags as $key => $tag ) {
     433                $count = $counts[ $key ];
     434                $tag_link = clean_url( $tag->link );
     435                $tag_id = isset($tags[ $key ]->id) ? $tags[ $key ]->id : $key;
     436                $tag_name = $tags[ $key ]->name;
     437                $a[] = "<a href='$tag_link' class='tag-link-$tag_id' title='" . attribute_escape( sprintf( __ngettext( $single_text, $multiple_text, $count ), $count ) ) . "'$rel style='font-size: " .
    430438                        ( $smallest + ( ( $count - $min_count ) * $font_step ) )
    431                         . "$unit;'>$tag</a>";
     439                        . "$unit;'>$tag_name</a>";
    432440        }
    433441
    434442        switch ( $format ) :