Облако меток для постов из определенной категории

24.12.2015 · WordPress

Облако меток для постов из определенной категории

Стандартный функционал WordPress позволяет вывести облако меток всех записей вашего сайта, для этого используется функция wp_tag_cloud(). Что делать, если необходимо вывести теги только из определенной категории, например, если у вас блог является категорией и необходимы теги только из блога. Для этого мы написали функцию, которая формирует облако тегов из категории.

Необходимо скопировать следующую функцию в файл functions.php вашей темы.

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

Параметры данной функции:

  1. smallest — минимальный размер шрифта для менее популярных тегов
  2. largest — максимальный размер шрифта для наиболее популярных тегов
  3. unit — размерность шрифта, принимает значения px, em, pt, %
  4. category — категория, из которой нужно выводить теги
HTML
<?function keengo_tag_cloud( $args = '' ) {
	// Стандартные параметры функции
	$defaults = array(
		'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'category' => 1
	);
	$args = wp_parse_args( $args, $defaults );
	global $wpdb;
	
	// Получаем ID таксономии выбранной категории и по нему получаем все посты
	$keengo_category = $args['category'];
	$keengo_term_taxonomy_id = $wpdb->get_var("SELECT term_taxonomy_id FROM $wpdb->term_taxonomy WHERE term_id = $keengo_category AND taxonomy = 'category' ");
	$keengo_posts = $wpdb->get_results("SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id = $keengo_term_taxonomy_id ", ARRAY_A);
	// Преобразовываем полученные ID постов в строку
	$keengo_post_IDs_array = array();
	foreach ( $keengo_posts as $keengo_post ) {
		$keengo_post_IDs_array[] = $keengo_post['object_id'];
	}
	$keengo_post_IDs = implode(',', $keengo_post_IDs_array);
	
	// Получаем список тегов для выбранных из категории постов
	$keengo_metas_array = $wpdb->get_results("SELECT term_taxonomy_id, count(object_id) FROM $wpdb->term_relationships WHERE object_id IN ($keengo_post_IDs) GROUP BY term_taxonomy_id ", ARRAY_A);
	$keengo_metas = array();
	$count_max = 0;
	$count_min = 1000000;
	// Для каждлго тега находим название, ссылку, количество
	foreach ( $keengo_metas_array as $meta_key => $keengo_meta ) {
		$keengo_meta_term_taxonomy_id = $keengo_meta['term_taxonomy_id'];
		$keengo_taxonomy = $wpdb->get_var("SELECT taxonomy FROM $wpdb->term_taxonomy WHERE term_taxonomy_id = $keengo_meta_term_taxonomy_id ");
		if ( $keengo_taxonomy == 'post_tag' ) {
			$keengo_term_id = $wpdb->get_var("SELECT term_id FROM $wpdb->term_taxonomy WHERE term_taxonomy_id = $keengo_meta_term_taxonomy_id ");
			$keengo_term_name = $wpdb->get_var("SELECT name FROM $wpdb->terms WHERE term_id = $keengo_term_id ");
			$keengo_metas[$keengo_term_name]['link'] = get_tag_link($keengo_term_id);
			$keengo_metas[$keengo_term_name]['count'] = $keengo_meta['count(object_id)'];
			
			if ( $keengo_meta['count(object_id)'] > $count_max ) {
				$count_max = $keengo_meta['count(object_id)'];
			}
			if ( $keengo_meta['count(object_id)'] < $count_min ) {
				$count_min = $keengo_meta['count(object_id)'];
			}
		}
	}
	// Сортируем полученный массив
	ksort($keengo_metas);
	
	// Формируем вывод тегов с указанием размера шрифта для наглядности
	$count_delta = $count_max - $count_min;
	$size_min = $args['smallest'];
	$size_max = $args['largest'];
	$size_delta = $size_max - $size_min;
	foreach ( $keengo_metas as $name => $meta ) {
		$size = $size_min + $size_delta * ($meta['count'] - $count_min) / $count_delta;
		echo('<a href="'.$meta['link'].'" style="font-size: '.$size.$args['unit'].'">'.$name.'</a> ');
	}
}?>

<?if ( function_exists('keengo_tag_cloud') ){
	$args = array(
		 'smallest'	=> 12
		,'largest'	=> 18
		,'unit'		=> 'px'
		,'category'	=> 5
	);
	keengo_tag_cloud( $args );
}?>
Назад в блог

От идеи —
к первому шагу.

Расскажите, что хотите создать.
Обсудим задачу и наметим следующий шаг.