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
@ -604,37 +605,34 @@ function wp_generate_tag_cloud( $tags, $args = '' ) {
if ( !isset( $args['topic_count_text_callback'] ) && isset( $args['single_text'] ) && isset( $args['multiple_text'] ) ) {
$body = 'return sprintf (
_n('.var_export($args['single_text'], true).', '.var_export($args['multiple_text'], true).', $count),
_n(' . var_export($args['single_text'], true) . ', ' . var_export($args['multiple_text'], true) . ', $count),
number_format_i18n( $count ));';
$args['topic_count_text_callback'] = create_function('$count', $body);
}
$args = wp_parse_args( $args, $defaults );
extract( $args );
if ( empty( $tags ) )
return;
// 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_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 ( 'DESC' == $order )
$tags = array_reverse( $tags, true );
}
}
if ( $number > 0 )