wp_generate_tag_cloud

Обрабатывает переданные данные терминов (меток) и возвращает HTML код облака меток.

Хуки из функции:
tag_cloud_sort
wp_generate_tag_cloud
wp_generate_tag_cloud_data

Использование

<?php wp_generate_tag_cloud( $tags, $args ); ?>

Параметры по умолчанию

$args = 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,
); 

wp_generate_tag_cloud( $tags, $args );
$tags(массив) (обязательный)
Массив объектов, содержащих данные о метках, которые нужно показать в “облаке”. На основе этих данных будет создан нужный размер текста для каждой метки и произведена сортировка терминов (меток).
По умолчанию: нет
$args(строка/массив)
Аргументы, характеризующие облако.
По умолчанию: предустановленные

Аргументы параметра $args

smallest(число)
Размер текста для меток с меньшим количеством записей (единицы измерения указываются в параметре unit).
По умолчанию: 8
largest(число)
Размер текста для меток с большим количеством записей (единицы измерения указываются в параметре unit).
По умолчанию: 22
unit(строка)
Единицы измерения параметров smallest и largest. Может быть любым CSS типом размера: pt, px, em, %.
По умолчанию: ‘pt’
number(число)
Максимально количество меток, которое будет показано в списке. Если установить на 0, то будут показаны все метки без ограничения.
format(строка)

В каком формате выводить список. Может быть:

  • flat – метки будут разделены разделителем, указанным в параметре separator;
  • list – UL список с CSS классом ‘wp-tag-cloud’;
  • array – вернет облако меток в массиве для дальнейшей обработки в PHP.

По умолчанию: ‘flat’

separator(строка)
Текст между метками.
По умолчанию: “n”
orderby(строка)
Сортировать метки по имени (name) или количеству записей (count).
По умолчанию: ‘name’
order(строка)

Порядок сортировки. Может быть:

  • ASC – по порядку (1,2,3);
  • DESC – в обратном порядке (3,2,1);
  • RAND – хаотичный порядок (перемешать).

По умолчанию: ‘ASC’

topic_count_text_callback(строка)
Функция, которая получает количество записей и возвращает текст для метки.
По умолчанию: ‘default_topic_count_text’
topic_count_scale_callback(строка)
Функция, масштабирования.
По умолчанию: ‘default_topic_count_scale’
filter(число)
Применять фильтр или нет. Если true, то результат будет пропускаться через фильтр: ‘wp_generate_tag_cloud’
По умолчанию: 1

Код из


wp-includes/category-template.php

WP 4.7.2

<?php
function wp_generate_tag_cloud( $tags, $args = '' ) {
	$defaults = array(
		'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 0,
		'format' => 'flat', 'separator' => "n", 'orderby' => 'name', 'order' => 'ASC',
		'topic_count_text' => null, 'topic_count_text_callback' => null,
		'topic_count_scale_callback' => 'default_topic_count_scale', 'filter' => 1,
	);

	$args = wp_parse_args( $args, $defaults );

	$return = ( 'array' === $args['format'] ) ? array() : '';

	if ( empty( $tags ) ) {
		return $return;
	}

	// Juggle topic count tooltips:
	if ( isset( $args['topic_count_text'] ) ) {
		// First look for nooped plural support via topic_count_text.
		$translate_nooped_plural = $args['topic_count_text'];
	} elseif ( ! empty( $args['topic_count_text_callback'] ) ) {
		// Look for the alternative callback style. Ignore the previous default.
		if ( $args['topic_count_text_callback'] === 'default_topic_count_text' ) {
			$translate_nooped_plural = _n_noop( '%s topic', '%s topics' );
		} else {
			$translate_nooped_plural = false;
		}
	} elseif ( isset( $args['single_text'] ) && isset( $args['multiple_text'] ) ) {
		// If no callback exists, look for the old-style single_text and multiple_text arguments.
		$translate_nooped_plural = _n_noop( $args['single_text'], $args['multiple_text'] );
	} else {
		// This is the default for when no callback, plural, or argument is passed in.
		$translate_nooped_plural = _n_noop( '%s topic', '%s topics' );
	}

	/**
	 * Filters how the items in a tag cloud are sorted.
	 *
	 * @since 2.8.0
	 *
	 * @param array $tags Ordered array of terms.
	 * @param array $args An array of tag cloud arguments.
	 */
	$tags_sorted = apply_filters( 'tag_cloud_sort', $tags, $args );
	if ( empty( $tags_sorted ) ) {
		return $return;
	}

	if ( $tags_sorted !== $tags ) {
		$tags = $tags_sorted;
		unset( $tags_sorted );
	} else {
		if ( 'RAND' === $args['order'] ) {
			shuffle( $tags );
		} else {
			// SQL cannot save you; this is a second (potentially different) sort on a subset of data.
			if ( 'name' === $args['orderby'] ) {
				uasort( $tags, '_wp_object_name_sort_cb' );
			} else {
				uasort( $tags, '_wp_object_count_sort_cb' );
			}

			if ( 'DESC' === $args['order'] ) {
				$tags = array_reverse( $tags, true );
			}
		}
	}

	if ( $args['number'] > 0 )
		$tags = array_slice( $tags, 0, $args['number'] );

	$counts = array();
	$real_counts = array(); // For the alt tag
	foreach ( (array) $tags as $key => $tag ) {
		$real_counts[ $key ] = $tag->count;
		$counts[ $key ] = call_user_func( $args['topic_count_scale_callback'], $tag->count );
	}

	$min_count = min( $counts );
	$spread = max( $counts ) - $min_count;
	if ( $spread <= 0 )
		$spread = 1;
	$font_spread = $args['largest'] - $args['smallest'];
	if ( $font_spread < 0 )
		$font_spread = 1;
	$font_step = $font_spread / $spread;

	// Assemble the data that will be used to generate the tag cloud markup.
	$tags_data = array();
	foreach ( $tags as $key => $tag ) {
		$tag_id = isset( $tag->id ) ? $tag->id : $key;

		$count = $counts[ $key ];
		$real_count = $real_counts[ $key ];

		if ( $translate_nooped_plural ) {
			$title = sprintf( translate_nooped_plural( $translate_nooped_plural, $real_count ), number_format_i18n( $real_count ) );
		} else {
			$title = call_user_func( $args['topic_count_text_callback'], $real_count, $tag, $args );
		}

		$tags_data[] = array(
			'id'         => $tag_id,
			'url'        => '#' != $tag->link ? $tag->link : '#',
			'role'       => '#' != $tag->link ? '' : ' role="button"',
			'name'	     => $tag->name,
			'title'      => $title,
			'slug'       => $tag->slug,
			'real_count' => $real_count,
			'class'	     => 'tag-link-' . $tag_id,
			'font_size'  => $args['smallest'] + ( $count - $min_count ) * $font_step,
		);
	}

	/**
	 * Filters the data used to generate the tag cloud.
	 *
	 * @since 4.3.0
	 *
	 * @param array $tags_data An array of term data for term used to generate the tag cloud.
	 */
	$tags_data = apply_filters( 'wp_generate_tag_cloud_data', $tags_data );

	$a = array();

	// generate the output links array
	foreach ( $tags_data as $key => $tag_data ) {
		$class = $tag_data['class'] . ' tag-link-position-' . ( $key + 1 );
		$a[] = "<a href='" . esc_url( $tag_data['url'] ) . "'" . $tag_data['role'] . " class='" . esc_attr( $class ) . "' title='" . esc_attr( $tag_data['title'] ) . "' style='font-size: " . esc_attr( str_replace( ',', '.', $tag_data['font_size'] ) . $args['unit'] ) . ";'>" . esc_html( $tag_data['name'] ) . "</a>";
	}

	switch ( $args['format'] ) {
		case 'array' :
			$return =& $a;
			break;
		case 'list' :
			$return = "<ul class='wp-tag-cloud'>nt<li>";
			$return .= join( "</li>nt<li>", $a );
			$return .= "</li>n</ul>n";
			break;
		default :
			$return = join( $args['separator'], $a );
			break;
	}

	if ( $args['filter'] ) {
		/**
		 * Filters the generated output of a tag cloud.
		 *
		 * The filter is only evaluated if a true value is passed
		 * to the $filter argument in wp_generate_tag_cloud().
		 *
		 * @since 2.3.0
		 *
		 * @see wp_generate_tag_cloud()
		 *
		 * @param array|string $return String containing the generated HTML tag cloud output
		 *                             or an array of tag links if the 'format' argument
		 *                             equals 'array'.
		 * @param array        $tags   An array of terms used in the tag cloud.
		 * @param array        $args   An array of wp_generate_tag_cloud() arguments.
		 */
		return apply_filters( 'wp_generate_tag_cloud', $return, $tags, $args );
	}

	else
		return $return;
}