WordPress как на ладони
wordpress jino

wp_tag_cloud() WP 2.3

Выводит "облако меток": список меток в виде облака. Можно указать произвольную таксономию.

Чтобы вывести элементы произвольной таксономии в виде облака, укажите название таксономии в параметре taxonomy.

"Облако меток" называется так, потому что размер текста каждой метки зависит от того, сколько записей связано с меткой. Чем больше записей, тем больше будет текст метки (в итоге получается нечто похожее на облако).

С версии 2.8 был добавлен параметр taxonomy, позволяющий создавать облако не только для стандартных меток, но и для категорий и произвольных таксономий.

Работает на основе: wp_generate_tag_cloud()
Хуки из функции:
Возвращает

Выводит на экран html код списка.
Возвращает HTML, если параметр echo = false.
Вернет массив облака меток, если параметр format = array.
Вернет false, если не удалось получить метки.

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

<?php wp_tag_cloud( $args ); ?>

Шаблон использования

wp_tag_cloud( array(
	'smallest'                  => 8,
	'largest'                   => 22,
	'unit'                      => 'pt',
	'number'                    => 45,
	'format'                    => 'flat',
	'separator'                 => "\n",
	'orderby'                   => 'name',
	'order'                     => 'ASC',
	'exclude'                   => null,
	'include'                   => null,
	'topic_count_text_callback' => 'default_topic_count_text',
	'link'                      => 'view',
	'taxonomy'                  => 'post_tag',
	'echo'                      => true,
) );
$args(строка/массив)
Аргументы, на основе которых будет построен список.
По умолчанию: базовые значения

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

В $args можно также указать все параметры функции get_terms(). Получение элементов таксономии работает на базе этой функции.

smallest(число)
Размер текста для меток с меньшим количеством записей (единицы измерения указываются в параметре unit).
По умолчанию: 8
largest(число)
Размер текста для меток с большим количеством записей (единицы измерения указываются в параметре unit).
По умолчанию:
unit(строка)
Единицы измерения параметров smallest и largest. Может быть любым CSS типом размера: pt, px, em, %.
По умолчанию: 'pt'
number(число)
Максимально количество меток, которое будет показано в списке. Если установить на 0, то будут показаны все метки без ограничения.
По умолчанию: 45
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 - хаотичный порядок (перемешать).

order и orderby не влияют на запрос к базе данных. Метки сначала получаются из базы данных, затем сортируются. Эти параметры для получения из базы данных равны: orderby=count и order=DESC и их нельзя изменить.
По умолчанию: 'ASC'

exclude(строка)
Исключить указанные метки. Указывать нужно ID через запятую.
По умолчанию: null
include(строка)
Показать только указанные метки. Указывать нужно ID через запятую.
По умолчанию: null
topic_count_text_callback(строка/массив)
Функция, которая получает количество записей и возвращает текст для метки. Можно установить свою функцию, если нужно отображать какой-либо другой текст с количеством записей для каждой метки.
По умолчанию: default_topic_count_text
link(строка)

Куда будет вести ссылка метки.

  • view - по нажатию на метку, попадем на страницу метки;
  • edit - по нажатию на метку, попадем на страницу редактирования метки.
    По умолчанию: view
taxonomy(строка/массив)

Название таксономии или массив нескольких названий, из которых будет построено облако. Может быть:

  • post_tag;
  • category;
  • link_category;
  • Своя таксономия;
  • Массив названий таксономий - параметр введен в версии 3.1.
    По умолчанию: post_tag
show_count(логический)
Показывать ли число записей в метке. По умолчанию 0. Может быть: 0, 1 или true/false. С WP 4.8.
echo(логический)
1 - Выводить на экран, 0 - возвращать результат для дальнейшей обработки.
По умолчанию: 1 (true)

Примеры

#1 Базовое использование

Выведем облако меток с заголовком "Популярные метки":

<?php if ( function_exists('wp_tag_cloud') ){ ?>
	<li>
		<h2>Популярные метки</h2>
		<ul>
			<?php wp_tag_cloud('smallest=8&largest=22'); ?>
		</ul>
	</li>
<?php } ?>

#1.2. Еще одни пример демонстрирующий передачу разных параметров

Изменим размеры меток (smallest=15&largest=40), ограничим количество выводимых меток (number=50) и отсортируем их по количеству записей, а не по имени (orderby=count):

<?php wp_tag_cloud('smallest=15&largest=40&number=50&orderby=count'); ?>

#2 Получим список, не будем выводить его на экран

Запишем список в параметр $tag, чтобы потом использовать его в php для своих целей:

<?php $tag = wp_tag_cloud('format=array' );?>

#3 Облако категорий

Выведем облако категорий, вместо облака меток. Для этого изменим название таксономии:

<?php wp_tag_cloud( array( 'taxonomy' => 'category' ) ); ?>

#3.1. Облако меток и категорий одновременно

Можно слепить категории и метки в одно облако:

<?php
  $args = array(
	'taxonomy'  => array('post_tag','category'),
   ); 

  wp_tag_cloud($args);
?>

#4 Изменение текста атрибута title у тега <a>

При наведении на ссылку, показывается количество записей метки. Чтобы изменить этот текст, можно использовать параметр topic_count_text_callback, в котором укажем свою функцию для создания текста:

<?php
wp_tag_cloud( array( 'topic_count_text_callback' => 'my_tag_text_callback' ) ); 

function my_tag_text_callback( $count ) {
 return sprintf( _n('%s картинка', '%s картинок', $count), number_format_i18n( $count ) );
}
?>

#5 Архив меток

Как один из вариантов использования меток, предлагаю создать архивные страницы меток. При клике на определенную метку, мы попадаем на страницу с постами связанными с этой меткой. Как выглядет такая страница, определяется файлом шаблона tag.php, если такого файла нет (обычно его ент), то формирование вывода отдается файлу archives.php.

Давайте сделаем страницу метки, на которой в самом начале будет показано облако меток, а после него записи относящиеся к выбранной метке. Для этого создадим (если нет) или изменим (если существует) файл tag.php. Создавать файл нужно в каталоге темы.

Содержимое файла tags.php:

<?php
/*
Template Name: Tag Archive
*/
?>

<?php get_header(); ?>

<div>

<h2>Tag Archive</h2>

<?php wp_tag_cloud(''); ?>
	<div class="navigation">
<div class="alignleft"><?php next_posts_link('« Older Entries') ?></div>
<div class="alignright"><?php previous_posts_link('Newer Entries »') ?></div>
	</div>
<?php if (have_posts()) : ?>
		<?php while (have_posts()) : the_post(); ?>
		<h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h2>
	<div class="entry">
	<?php the_content('Read the rest of this entry »'); ?>
	</div>

	<?php endwhile; ?>
	<?php endif; ?>
</div>

<?php get_footer(); ?>

В данном примере не учитываются CSS стили, поэтому возможна несовместимость с шаблоном.

#6 Изменение параметров по умолчанию для виджета облака меток через фильтр

Допустим, нам нужно уменьшить максимальный шрифты для виджета с облаком меток. Нужно поставить значение 16, а не 22 для параметра 'largest'. Для этого используем хук widget_tag_cloud_args

add_filter('widget_tag_cloud_args', function( $args ){
	$args['largest'] = 16;

	return $args;
});

На этот пример меня подтолкнул этот комменатрий

Заметки

  • В версии 3.1 добавлен возможность передавать массивы в параметр taxonomy;
  • В версии 2.9 добавлен параметр separator;
  • В версии 2.8 добавлены параметры taxonomy и echo;
  • В версии 2.7 добавлен параметр link;

Код wp tag cloud: wp-includes/category-template.php VER 4.9.1

<?php
function wp_tag_cloud( $args = '' ) {
	$defaults = array(
		'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 45,
		'format' => 'flat', 'separator' => "\n", 'orderby' => 'name', 'order' => 'ASC',
		'exclude' => '', 'include' => '', 'link' => 'view', 'taxonomy' => 'post_tag', 'post_type' => '', 'echo' => true,
		'show_count' => 0,
	);
	$args = wp_parse_args( $args, $defaults );

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

	if ( empty( $tags ) || is_wp_error( $tags ) )
		return;

	foreach ( $tags as $key => $tag ) {
		if ( 'edit' == $args['link'] )
			$link = get_edit_term_link( $tag->term_id, $tag->taxonomy, $args['post_type'] );
		else
			$link = get_term_link( intval($tag->term_id), $tag->taxonomy );
		if ( is_wp_error( $link ) )
			return;

		$tags[ $key ]->link = $link;
		$tags[ $key ]->id = $tag->term_id;
	}

	$return = wp_generate_tag_cloud( $tags, $args ); // Here's where those top tags get sorted according to $args

	/**
	 * Filters the tag cloud output.
	 *
	 * @since 2.3.0
	 *
	 * @param string $return HTML output of the tag cloud.
	 * @param array  $args   An array of tag cloud arguments.
	 */
	$return = apply_filters( 'wp_tag_cloud', $return, $args );

	if ( 'array' == $args['format'] || empty($args['echo']) )
		return $return;

	echo $return;
}

Cвязанные функции

Из метки: Список (wp_list списки)

Еще из раздела: Метки

wp_tag_cloud 42 комментария
Полезные 6 Вопросы 2 Все
  • lincaseidhe62 cайт: ardeya.ru

    Функция изменения параметров стандартного виджета облако меток . Может кому пригодится) Все изменения в файле function.php

    1
    Ответитьгод назад #
    • Kama4696

      Спасибо за коммент, добавил это в примеры. И там у тебя немного не нормально сделано - не нужно указывать все параметры, можно указать только один который хочешь изменить...

      Ответитьгод назад #
  • Павел

    Здравствуйте! Может быть тут подскажут знающие люди.
    Есть категория, пусть будет "игры", в ней много постов, у каждого поста тэги, допустим "игра1", "игра2", "игра3".
    Как на странице категории "Игры" вывести тэги, которые используются в данной категории?

    • Kama4696

      Получи ID всех записей из рубрики см. get_posts() и передай все эти ID в параметр object_ids этой функции в wp_tag_cloud(). Так ты получишь облако тегов, которые используются записями в рубрике...

      Параметр object_ids описан в функции get_terms()

      • campusboy1950 cайт: www.youtube.com/c/wpplus

        Представляю какая будет нагрузка, если записей в рубрике будет много. Хотя для получения ID можно использовать wp_query с аргументом "fields"=>"ids", то может и неплохо по итогу выйдет.

        1
  • Вячеслав

    Добрый день! Помогите, пожалуйста!
    Работаю с wordpress несколько недель и чем дальше, тем больше задач, с которыми не могу справиться самостоятельно.
    В данный момент безуспешно пытаюсь найти решение для облака меток, позволяющее выводить только метки ТЕКУЩЕЙ записи, а не все популярные. Как я понял стандартный виджет "тонкой" настройке в этой части не поддаётся, а вторгаться в исходники в wp-includes на форумах настоятельно не рекомендуют.
    Как быть?
    Правильно ли я понимаю, что мне нужно прописать "свою" таксонометрию?
    Существуют ли другие значения аргументов для taxonomy, помимо стандартного 'post_tag', возвращающего все метки?
    Еще раз повторюсь, что мне необходимо выводить в облаке только метки ТЕКУЩЕЙ записи, вместо всех популярных.

    С уважением,
    Вячеслав

    • campusboy1950 cайт: www.youtube.com/c/wpplus

      Привет. А смотрели функции get_the_tags или the_tags? Они возвращают метки текущего поста, правда не в виде облака, а как захотите. То есть получили метки поста, а как вёрстку берете уже на себя.

      • Вячеслав

        Спасибо огромное!!! С Вашей подачи стал разбираться, а дальше сделал следующее:
        Во-первых в functions.php вставил следующий код (для чтения php из виджета "текст"):

        function php_in_widgets($widget_content) {
        	if (strpos($widget_content, '' . $widget_content);
        		$widget_content = ob_get_contents();
        		ob_end_clean();
        	}
        	return $widget_content;
        }
        add_filter('widget_text', 'php_in_widgets', 99);

        Во-вторых прописал в виджете "Текст":

        <?php the_tags( 'Tags: ', ', ', '' ); ?>

        Всё получилось! Теперь постараюсь оформить текстовый виджет как облако...

        Все правильно?

        • campusboy1950 cайт: www.youtube.com/c/wpplus

          По мне так вставлять в виджет исполняемый код (php) не лучшая идея, так как это небезопасно. Я бы это сделал с помощью шоткода. И разрешил шоткодам обрабатываться в виджетах (пример №4).

          Почему бы не отредактировать шаблон нужной страницы и не использовать <?php the_tags( 'Tags: ', ', ', '' ); ?> там? По какой причине надо вставлять его именно в виджет?

          И ещё - почему именно облако? У вашей записи так много меток, что надо облако? smile

          1
          • Вячеслав

            В первую очередь хочу поблагодарить Вас, что откликнулись на мой вопрос и поддерживаете связь! )
            Попробую объяснить и приложить скриншот для наглядности...
            Это скриншот моего блога о памятниках Москвы … Собственно из-за желания его создать мне и пришлось погрузиться в волшебный мир wordpress smile
            По поводу облака – мне в общем-то не облако нужно как таковое, а вот такой вот блок-виджет расположенный сверху (это как раз и есть стандартный виджет wp «облако меток»). Мне очень нравится его оформление, но не устраивает отображение всех популярных меток, поскольку мне нужны только те метки, которые присвоены текущей записи (статье).
            А виджет, который расположен ниже – это то, что я пытаюсь сейчас сделать самостоятельно. Метки текущей записи у меня вывести получилось, а вот как сделать такое же оформление – пока еще не могу разобраться…
            Другими словами, я хочу добиться такого же оформления как у верхнего блока (виджета), но только для текущей записи.
            Надеюсь смог объяснить и простите за мой зеленый непрофессионализм! smile Пытаюсь освоить эту науку, но пока тяжеловато )

            • campusboy1950 cайт: www.youtube.com/c/wpplus

              Всегда пожалуйста, приходите ещё) По сути, к ссылкам надо добавить css классы, чтобы повторить оформление того блока. Я не знаю, какие классы у тех ссылок, что нравятся. Давайте страничку, чтобы можно было поглядеть. Иначе копайте в эту сторонку smile повторение стилей

              • Вячеслав

                Конечно, вот ссылка! ) У меня секретов нет, даже буду рад, если будете посещать мою страничку smile
                http://moscowme.ru/

                Честно говоря что такое "css" и как их копировать пока не представляю ... sad
                Знаю, что можно посмотреть текущий код, нажав правую кнопку мыши, но как с ним работать ... unknw

  • Николай cайт: ecobuild.pro

    Добрый день! А справедливо ли все изложенное для управления облаком меток в виджете страницы рубрики в wooconmerce?

  • Дмитрий @

    Здравствуйте,

    Пытаюсь сделать вывод облака тэгов (без пустых, так что хотя бы одна запись была), но надо заменить title ссылки на произвольное поле (advanced custom field). Ищу наиболее оптимальный вариант, который не сильно нагрузит сервер.

    Сам вывод облака тэгов прост:

    $args = array(
    'smallest' => 10,
    'largest' => 10,
    'number' => 250,
    'topic_count_text_callback' => 'my_tag_text_callback',
    ); 
    wp_tag_cloud( $args );  

    А вот с выводом title проблема. Пока что остановился на этом в functions.php, но не могу найти ошибку

    function my_tag_text_callback( $term_id ) {
    	$queried_object = get_queried_object();
    	$term_id = $queried_object->term_id;  
    	$key_title = get_field("title_page", $term_id);
    	return $key_title;
    }
    -1
  • Олег

    Делаю архив меток, но в нем не появляется пагинация.

    <?php $cur_tag = single_tag_title( '', false );
    $args = array(
    	'post_type' => 'any',
    	'tag'       => get_term_by( 'name', $cur_tag, 'post_tag' )->slug,
    	);
    	if ( get_query_var('paged') ) $args += [ 'paged' => get_query_var('paged') ];
    	$query = new WP_Query( $args ); if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post(); ?>
    ...
    <?php if ( count($query->posts) >= $posts_per_page || get_query_var('paged') ) { 
    		the_posts_pagination( array(
    		'end_size'  => 1,
    		'mid_size'  => 1,
    		'prev_text' => '<', 
    		'next_text' => '>', ) ); } ?>
    

    Если в код добавить $GLOBALS['wp_query']->max_num_pages = 5;, то на странице появится пагинация ровно на пять страниц (не зависит от количества постов с этим тегом), но при переходе на следующую страницу (/page/2) появляется ОШИБКА 404 (СТРАНИЦА 2).

    Что я делаю не так?

    Ответить4 дня назад #

Здравствуйте, !

Ваш комментарий