wp_generate_tag_cloud

Definition:
function wp_generate_tag_cloud( $tags, $args = '' ) {}

Generates a tag cloud (heatmap) from provided data.
The text size is set by the ‘smallest’ and ‘largest’ arguments, which will use the ‘unit’ argument value for the CSS text size unit. The ‘format’ argument can be ‘flat’ (default), ‘list’, or ‘array’. The flat value for the ‘format’ argument will separate tags with spaces. The list value for the ‘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.

Parameters

  • array $tags: List of tags.
  • string|array $args: Optional, override default arguments.

Defined filters

  • tag_cloud_sort
    apply_filters( 'tag_cloud_sort', $tags, $args )
  • wp_generate_tag_cloud
    apply_filters( 'wp_generate_tag_cloud', $return, $tags, $args )

Source code

function wp_generate_tag_cloud( $tags, $args = '' ) {

	global $wp_rewrite;

	$defaults = array(

		'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 0,

		'format' => 'flat', 'separator' => "\n", 'orderby' => 'name', 'order' => 'ASC',

		'topic_count_text_callback' => 'default_topic_count_text',

		'topic_count_scale_callback' => 'default_topic_count_scale', 'filter' => 1,

	);



	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),

			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;



	$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, '_wp_object_name_sort_cb' );

			else

				uasort( $tags, '_wp_object_count_sort_cb' );



			if ( 'DESC' == $order )

				$tags = array_reverse( $tags, true );

		}

	}



	if ( $number > 0 )

		$tags = array_slice($tags, 0, $number);



	$counts = array();

	$real_counts = array(); // For the alt tag

	foreach ( (array) $tags as $key => $tag ) {

		$real_counts[ $key ] = $tag->count;

		$counts[ $key ] = $topic_count_scale_callback($tag->count);

	}



	$min_count = min( $counts );

	$spread = max( $counts ) - $min_count;

	if ( $spread <= 0 )

		$spread = 1;

	$font_spread = $largest - $smallest;

	if ( $font_spread < 0 )

		$font_spread = 1;

	$font_step = $font_spread / $spread;



	$a = array();



	foreach ( $tags as $key => $tag ) {

		$count = $counts[ $key ];

		$real_count = $real_counts[ $key ];

		$tag_link = '#' != $tag->link ? esc_url( $tag->link ) : '#';

		$tag_id = isset($tags[ $key ]->id) ? $tags[ $key ]->id : $key;

		$tag_name = $tags[ $key ]->name;

		$a[] = "<a href='$tag_link' class='tag-link-$tag_id' title='" . esc_attr( call_user_func( $topic_count_text_callback, $real_count ) ) . "' style='font-size: " .

			( $smallest + ( ( $count - $min_count ) * $font_step ) )

			. "$unit;'>$tag_name</a>";

	}



	switch ( $format ) :

	case 'array' :

		$return =& $a;

		break;

	case 'list' :

		$return = "<ul class='wp-tag-cloud'>\n\t<li>";

		$return .= join( "</li>\n\t<li>", $a );

		$return .= "</li>\n</ul>\n";

		break;

	default :

		$return = join( $separator, $a );

		break;

	endswitch;



	if ( $filter )

		return apply_filters( 'wp_generate_tag_cloud', $return, $tags, $args );

	else

		return $return;

}

3673

No comments yet... Be the first to leave a reply!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: