Egyes megbízásoknál igen csak ki kell használni a weboldal felületének minden kis pontját. Amikor kerülni akarjuk a túlzsúfoltságot és próbáljuk az elemeket összepréselni, hogy még kiférjen minden, de ne káoszos legyen. A címkék van ahol nem foglalnak sok helyet, azonban akik szeretnek bőkezűen bánni a címkézéssel (ami tanácsos is), azoknak kell a hely a szavak megjelenítéséhez. Persze mindemellett még linkelhetőek kell maradjanak. Így találtam egy megoldást, mely megfelelt.

A szerkesztés

A functions.php-ba ezt illesszük be:

function dropdown_tag_cloud( $args = '' ) {
  $defaults = array(
    'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 45,
    'format' => 'flat', 'orderby' => 'name', 'order' => 'ASC',
    'exclude' => '', 'include' => ''
  );
  $args = wp_parse_args( $args, $defaults );

  $tags = get_tags( array_merge($args, array('orderby' => 'count', 'order' => 'DESC')) ); // Always query top tags

  if ( empty($tags) )
    return;

  $return = dropdown_generate_tag_cloud( $tags, $args ); // Here's where those top tags get sorted according to $args
  if ( is_wp_error( $return ) )
    return false;
  else
    echo apply_filters( 'dropdown_tag_cloud', $return, $args );
}

function dropdown_generate_tag_cloud( $tags, $args = '' ) {
  global $wp_rewrite;
  $defaults = array(
    'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 45,
    'format' => 'flat', 'orderby' => 'name', 'order' => 'ASC'
  );
  $args = wp_parse_args( $args, $defaults );
  extract($args);

  if ( !$tags )
    return;
  $counts = $tag_links = array();
  foreach ( (array) $tags as $tag ) {
    $counts[$tag->name] = $tag->count;
    $tag_links[$tag->name] = get_tag_link( $tag->term_id );
    if ( is_wp_error( $tag_links[$tag->name] ) )
      return $tag_links[$tag->name];
    $tag_ids[$tag->name] = $tag->term_id;
  }

  $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;

  // SQL cannot save you; this is a second (potentially different) sort on a subset of data.
  if ( 'name' == $orderby )
    uksort($counts, 'strnatcasecmp');
  else
    asort($counts);

  if ( 'DESC' == $order )
    $counts = array_reverse( $counts, true );

  $a = array();

  $rel = ( is_object($wp_rewrite) && $wp_rewrite->using_permalinks() ) ? ' rel="tag"' : '';

  foreach ( $counts as $tag => $count ) {
    $tag_id = $tag_ids[$tag];
    $tag_link = clean_url($tag_links[$tag]);
    $tag = str_replace(' ', '&nbsp;', wp_specialchars( $tag ));
    $a[] = "\t<option value='$tag_link'>$tag ($count)</option>";
  }

  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("\n", $a);
    break;
  endswitch;

  return apply_filters( 'dropdown_generate_tag_cloud', $return, $tags, $args );
}

A megjelenésünk kívánt részére pedig ezt:

<select name="tag-dropdown" onchange="document.location.href=this.options[this.selectedIndex].value;">
  <option value="#">Címkék</option>
  <?php dropdown_tag_cloud('number=0&order=asc'); ?>
</select>

Ezután már csak css-ben kell formáznunk a megfelelőre, hogy szép is legyen.

Források: