Fix wp_tag_cloud('order=RAND'), don't pre-sort if filter 'tag_cloud_sort' is used to sort the tags, props Joern_W, fixes #10393

git-svn-id: http://svn.automattic.com/wordpress/trunk@11744 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
azaozz 2009-07-26 01:23:46 +00:00
parent f48bea5721
commit 46ece84195
1 changed files with 20 additions and 22 deletions

View File

@ -573,8 +573,9 @@ function default_topic_count_text( $count ) {
* 'format' argument will format the tags in a UL HTML list. The array value for
* the 'format' argument will return in PHP array type format.
*
* The 'tag_cloud_sort' filter allows you to override the sorting done
* by the 'orderby' argument; passed to the filter: $tags array and $args array.
* The 'tag_cloud_sort' filter allows you to override the sorting.
* Passed to the filter: $tags array and $args array, has to return the $tags array
* after sorting it.
*
* The 'orderby' argument will accept 'name' or 'count' and defaults to 'name'.
* The 'order' is the direction to sort, defaults to 'ASC' and can be 'DESC' or
@ -610,31 +611,28 @@ function wp_generate_tag_cloud( $tags, $args = '' ) {
}
$args = wp_parse_args( $args, $defaults );
extract( $args );
if ( empty( $tags ) )
return;
$tags_sorted = apply_filters( 'tag_cloud_sort', $tags, $args );
if ( $tags_sorted != $tags ) { // the tags have been sorted by a plugin
$tags = $tags_sorted;
unset($tags_sorted);
} else {
if ( 'RAND' == $order ) {
shuffle($tags);
} else {
// SQL cannot save you; this is a second (potentially different) sort on a subset of data.
if ( 'name' == $orderby )
uasort( $tags, create_function('$a, $b', 'return strnatcasecmp($a->name, $b->name);') );
else
uasort( $tags, create_function('$a, $b', 'return ($a->count > $b->count);') );
$tags = apply_filters( 'tag_cloud_sort', $tags, $args );
if ( 'DESC' == $order )
$tags = array_reverse( $tags, true );
elseif ( 'RAND' == $order ) {
$keys = (array) array_rand( $tags, count( $tags ) );
$temp = array();
foreach ( $keys as $key )
$temp[$key] = $tags[$key];
$tags = $temp;
$temp = null;
unset( $temp );
}
}
if ( $number > 0 )