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 comment