Масив об’єктів WP_Term , які потрібно показати в “хмарі”. На основі цих даних буде створено потрібний розмір тексту для кожної мітки та проведено сортування термінів (міток).
$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’
show_count (логічний)
Чи показувати кількість записів у мітці. За замовчуванням 0. Можливо: 0, 1 або true/false. З WP 4.8.
filter (число)
Застосовувати фільтр чи ні. Якщо true, результат буде пропускатися через фільтр: wp_generate_tag_cloud .
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,
'show_count' => 0,
);
$ args = wp_parse_args ($ args, $ defaults);
$return = ( 'array' === $args['format'] ) ? array() : '';
if ( empty( $tags ) ) {
return $return;
}
// Juggle topic counts.
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 ( 'default_topic_count_text' === $args['topic_count_text_callback'] ) {
/* translators: %s: Number of items (tags). */
$translate_nooped_plural = _n_noop( '%s item', '%s items' );
} 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.
// phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralSingle,WordPress.WP.I18n.NonSingularStringLiteralPlural
$translate_nooped_plural = _n_noop( $args['single_text'], $args['multiple_text'] );
} else {
// Це не означає, що якщо не callback, plural, або argument is passed in.
/* translators: %s: Number of items (tags). */
$translate_nooped_plural = _n_noop( '%s item', '%s items' );
}
/**
* Filters how the items in tag cloud are sorted.
*
* @ Since 2.8.0
*
* @param WP_Term[] $tags Ordered array of terms.
* @param array $args На 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;
$aria_label = false;
/*
* Визначте, скільки потрібно виконати 'aria-label' atribut with the tag name and count.
* When tags have different font size, вони visually convey an important information
* that should be available to assistive technologies too. On the other hand, sometimes
* themes set up the Tag Cloud для відтворення всіх tags with the same font size (setting
* the 'smallest' and 'largest' arguments to the same value).
* У відповідь на все, щоб скористатися самим вмістом для всіх користувачів, 'aria-label' gets printed out:
* - коли tags have a different size
* - when the tag count is displayed (для example when users check the checkbox in the
* Tag Cloud widget), незважаючи на tags font size
*/
if ( $args['show_count'] || 0 !== $font_spread ) {
$aria_label = true;
}
// 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 ) {
$formatted_count = sprintf(translate_nooped_plural( $translate_nooped_plural, $real_count ), number_format_i18n( $real_count ));
} else {
$formatted_count = 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,
'formatted_count' => $formatted_count,
'slug' => $tag->slug,
'real_count' => $real_count,
'class' => 'tag-cloud-link tag-link-' . $tag_id,
'font_size' => $args['smallest'] + ( $count - $min_count ) * $font_step,
'aria_label' => $aria_label? sprintf( ' aria-label="%1$s (%2$s)"', esc_attr( $tag->name ), esc_attr( $formatted_count ) ) : '',
'show_count' => $args['show_count'] ? '<span class="tag-link-count"> (' . $real_count . ')</span>' : '',
);
}
/**
* Filters the data використовується для створення tag cloud.
*
* @ Since 4.3.0
*
* @param array[] $tags_data На array of term data arrays for terms use 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[] = sprintf(
'<a href="%1$s"%2$s class="%3$s" style="font-size: %4$s;"%5$s>%6$s%7$s< /a>',
esc_url( $tag_data['url'] ),
$tag_data['role'],
esc_attr($class),
esc_attr( str_replace( ',', '.', $tag_data['font_size'] ) . $args['unit'] ),
$tag_data['aria_label'],
esc_html( $tag_data['name'] ),
$tag_data['show_count']
);
}
switch ( $args['format'] ) {
case 'array':
$return =& $a;
break;
case 'list':
/*
* Force role="list", як деякі браузери (sic: Safari 10) не expose to assistive
* technologys default role when the list is styled with `list-style: none`.
* Note: this is redundant but doesn't harm.
*/
$return = "<ul class='wp-tag-cloud' role='list'>nt<li>";
$return .= implode( "</li>nt<li>", $a );
$return .= "</li>n</ul>n";
break;
default:
$return = implode( $args['separator'], $a);
break;
}
if ( $args['filter'] ) {
/**
* Filters 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 string[]|string $return String містить generated HTML tag cloud output
* або array of tag links if the 'format' argument
* equals 'array'.
* @param WP_Term[] $tags На array of terms використовується в tag cloud.
* @param array $args На array of wp_generate_tag_cloud() arguments.
*/
return apply_filters( 'wp_generate_tag_cloud', $return, $tags, $args);
} else {
return $return;
}
}