tag if it exists
if ( ( $config['hideemptywidgetheader'] == 'Yes' && isset( $title ) && $title != '' ) || $config['hideemptywidgetheader'] != 'Yes') {
echo $before_title;
echo $title;
echo $after_title;
}
echo nktagcloud_the_cloud($config);
echo $after_widget;
}
/**
* Output the tag cloud as configured
*
* @param array $option the plugin config
*
* @return string the tag cloud
*
* @since 0.8.1
*/
function nktagcloud_the_cloud( $config ) {
$smallest = $config['smallest'];
$largest = $config['largest'];
$unit = $config['unit'];
$number = $config['number'];
$format = $config['format'];
$order = $config['order'];
$orderby = $config['orderby'];
$exclude = $config['exclude'];
$include = $config['include'];
$categories = $config['categories'];
$replace = $config['replace'];
/*
* The 'single' and 'post_id' settings are not configurable through the
* options page and only intended for the shortcodes.
*/
$single = 'No';
$post_id = null;
$mincount = $config['mincount'];
$separator = $config['separator'];
$hidelastseparator = $config['hidelastseparator'];
$inject_count = $config['inject_count'];
$inject_count_outside = $config['inject_count_outside'];
$taxonomy = $config['taxonomy'];
$nofollow = $config['nofollow'];
if ( function_exists( 'taxonomy_exists' ) ) {
if ( !taxonomy_exists( $taxonomy ) )
$taxonomy = 'post_tag';
}
else
$taxonomy = 'post_tag'; // force tags for < 3.0
return nk_wp_tag_cloud("largest=$largest&smallest=$smallest&unit=$unit&number=$number&format=$format&order=$order&orderby=$orderby&exclude=$exclude&include=$include&categories=$categories&single=$single&replace=$replace&separator=$separator&hidelastseparator=$hidelastseparator&inject_count=$inject_count&inject_count_outside=$inject_count_outside&post_id=$post_id&mincount=$mincount&nofollow=$nofollow&taxonomy=$taxonomy");
}
/**
* Print the default CSS styles in the
*
* @param string $underline TODO
* @todo fix above
* @todo external file
*/
function nktagcloud_head( $underline ) {
$option = get_option( 'nktagcloud' );
$config = $option['config'];
if ( !( $config['rmcss'] === 'Yes' ) && ( $config['format'] === 'list' )) { ?>
Better Tag Cloud', 'nktagcloud' );
echo ' ';
}
/* This was copied from the wordpress source and modified, see
* wp-includes/category-template.php
*/
/**
* Display tag cloud.
*
* 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.
*
* 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'.
*
* The 'number' argument is how many tags to return. By default, the limit will
* be to return the top 45 tags in the tag cloud list.
*
* The 'topic_count_text_callback' argument is a function, which, given the count
* of the posts with that tag, returns a text for the tooltip of the tag link.
*
* The 'exclude' and 'include' arguments are used for the {@link get_tags()}
* function. Only one should be used, because only one will be used and the
* other ignored, if they are both set.
*
* The 'single' parameters is used to display only a single post's tags inside
* the loop.
*
* The 'categories' parameter will add categories to the tag cloud if set to 'Yes'
*
* The 'replace' paramter, if set to 'Yes', will change all blanks ' ' to
*
* The 'mincount' parameter will hide all tags that aren't used more often than
* mincount.
*
* The 'separator' will be printed between tags.
*
* 'inject_count' will add a counter to the tags is set to 'Yes'.
* 'inject_count_outside' will put this counter outside the tag link.
*
* @since 2.3.0
*
* @param array|string $args Optional. Override default arguments.
* @return array Generated tag cloud, only if no failures and 'array' is set for the 'format' argument.
*/
function nk_wp_tag_cloud( $args = '' ) {
$defaults = array(
'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 45,
'format' => 'flat', 'orderby' => 'name', 'order' => 'ASC',
'exclude' => '', 'include' => '', 'link' => 'view',
'single' => 'No',
'categories' => 'No',
'replace' => 'No',
'mincount' => '0',
'separator' => '',
'hidelastseparator' => 'No',
'inject_count' => 'No',
'inject_count_outside' => 'Yes',
'post_id' => null,
'nofollow' => 'No',
'taxonomy' => 'post_tag',
);
$args = wp_parse_args( $args, $defaults );
if ( intval( $args['post_id'] ) != 0 ) {
$my_query = new WP_Query( "cat=$category" );
if ( $my_query->have_posts() ) {
while ( $my_query->have_posts() ) {
$my_query->the_post();
$tags = apply_filters( 'get_the_tags', get_the_terms( null, 'post_tag' ) );
}
}
$GLOBALS['post'] = $GLOBALS['wp_query']->post; // restore $post
}
elseif ( $args['single'] == 'Yes' || $args['single'] == 'yes' ) {
$tags = apply_filters( 'get_the_tags', get_the_terms( null, $args['taxonomy'] ) );
}
else {
$tags = get_terms( $args['taxonomy'], array_merge( $args, array( 'orderby' => 'count', 'order' => 'DESC' ) ) );
}
// nkuttler
if ( $args['categories'] == 'Yes' ) {
$tags = array_merge ( $tags, get_categories() );
}
if ( empty( $tags ) )
return;
foreach ( $tags as $key => $tag ) {
if ( 'edit' == $args['link'] ) {
$link = get_edit_tag_link( $tag->term_id );
}
/* use category or tag link, whatever is needed */
/* TODO check for duplicate cat/tag names.. */
else {
if ( isset( $tag->cat_ID ) ) {
$link = get_category_link( $tag->term_id );
}
else {
$link = get_term_link( $tag, $args['taxonomy'] );
}
}
if ( is_wp_error( $link ) ) {
return false;
}
$tags[ $key ]->link = $link;
$tags[ $key ]->id = $tag->term_id;
}
$return = nk_wp_generate_tag_cloud( $tags, $args ); // Here's where those top tags get sorted according to $args
$return = apply_filters( 'wp_tag_cloud', $return, $args );
if ( 'array' == $args['format'] )
return $return;
// nkuttler - always return
return $return;
//echo $return;
}
/**
* 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.
*
* 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
* 'RAND'.
*
* The 'number' argument is how many tags to return. By default, the limit will
* be to return the entire tag cloud list.
*
* The 'topic_count_text_callback' argument is a function, which given the count
* of the posts with that tag returns a text for the tooltip of the tag link.
*
* See above ( nk_wp_tag_cloud() ) for more parameter definitions.
*
* @todo Complete functionality.
* @since 2.3.0
*
* @param array $tags List of tags.
* @param string|array $args Optional, override default arguments.
* @return string
*/
function nk_wp_generate_tag_cloud( $tags, $args = '' ) {
global $wp_rewrite;
$defaults = array(
'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 0,
'format' => 'flat', 'orderby' => 'name', 'order' => 'ASC',
'topic_count_text_callback' => 'default_topic_count_text',
'replace' => 'No',
'mincount' => '0',
'separator' => '',
'inject_count' => 'No',
'inject_count_outside' => 'Yes',
'nofollow' => 'No',
);
if ( !isset( $args['topic_count_text_callback'] ) && isset( $args['single_text'] ) && isset( $args['multiple_text'] ) ) {
$body = 'return sprintf (
__ngettext('.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);') );
if ( 'DESC' == $order )
$tags = array_reverse( $tags, true );
elseif ( 'RAND' == $order ) {
$keys = array_rand( $tags, count( $tags ) );
foreach ( $keys as $key )
$temp[$key] = $tags[$key];
$tags = $temp;
unset( $temp );
}
/* nkuttler: support sorting by two criteria */
if ( $order == 'both') {
$orderby = 'both';
}
if ( 'both' == $orderby ) {
function nktagcloud_compare_both( $a, $b ) {
$retval = strnatcmp( $b->count, $a->count );
if( !$retval ) return strnatcmp( $a->name, $b->name );
return $retval;
}
usort( $tags, 'nktagcloud_compare_both' );
}
/* end changes */
if ( $number > 0 )
$tags = array_slice($tags, 0, $number);
$counts = array();
foreach ( (array) $tags as $key => $tag )
$counts[ $key ] = $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();
$rel = ( is_object( $wp_rewrite ) && $wp_rewrite->using_permalinks() ) ? ' rel="tag"' : '';
/**
* Modifications my nkuttler
*/
$tags_to_show = 0;
if ( isset( $separator ) && $separator != '' ) {
$the_separator .= '';
$the_separator .= $separator;
$the_separator .= '';
/**
* @since 0.11.1 Loop to count the number of tags that will be printed
*/
foreach ( $tags as $key => $tag ) {
$count = $counts[ $key ];
if ( $count > $mincount )
$tags_to_show++;
}
}
$the_separator = '';
$tags_shown_so_far = 0;
foreach ( $tags as $key => $tag ) {
$count = $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;
if ( ( $tags_shown_so_far == $tags_to_show - 1 ) && $hidelastseparator == 'Yes' )
$the_separator = '';
/**
* Modifications by nkuttler
* Check and print if we should print the tag counter, in- or outside
* the tag link
*
* @since 0.8.5 calculate size value earlier, add class="nktagcloud-size"
* @since 0.8.5 add option minimum occurence needed to display a tag
* @since 0.11.0 add nofollow option
*/
if ( $replace == 'Yes' ) {
$tag_name = preg_replace( '# #', ' ', $tag_name );
$tag_name = preg_replace( '#-#', '‑', $tag_name );
}
$echo_nofollow = '';
if ( isset( $nofollow ) && $nofollow == 'Yes' )
$echo_nofollow = ' rel="nofollow" ';
$tagsize = round( $smallest + ( ( $count - $min_count ) * $font_step ), 2 );
$tagsize_int = (int) $tagsize;
if ( $count > $mincount ) {
$tags_shown_so_far++;
if ( $inject_count_outside == 'Yes' ) {
$a[] = "$tag_name" . nktagcloud_add_counter( $tag, $inject_count ) . $the_separator;
}
else {
$a[] = "$tag_name" . nktagcloud_add_counter( $tag, $inject_count ) ."" . $the_separator;
}
}
}
/* end changes */
switch ( $format ) :
case 'array' :
$return =& $a;
break;
case 'list' :
$return = "