Метка: custom post type

Вывод тегов для категории (включая подкатегории)

Добавляем в файл functions.php следующую функцию (код):

// get tags for category (with children)
function get_category_tags($args) {
	global $wpdb;
	
	$tags = $wpdb->get_results
	("
		SELECT DISTINCT terms2.term_id as tag_id, terms2.name as tag_name, null as tag_link
		FROM
			".$wpdb->prefix."posts as p1
			LEFT JOIN ".$wpdb->prefix."term_relationships as r1 ON p1.ID = r1.object_ID
			LEFT JOIN ".$wpdb->prefix."term_taxonomy as t1 ON r1.term_taxonomy_id = t1.term_taxonomy_id
			LEFT JOIN ".$wpdb->prefix."terms as terms1 ON t1.term_id = terms1.term_id,

			".$wpdb->prefix."posts as p2
			LEFT JOIN ".$wpdb->prefix."term_relationships as r2 ON p2.ID = r2.object_ID
			LEFT JOIN ".$wpdb->prefix."term_taxonomy as t2 ON r2.term_taxonomy_id = t2.term_taxonomy_id
			LEFT JOIN ".$wpdb->prefix."terms as terms2 ON t2.term_id = terms2.term_id
		WHERE
			t1.taxonomy = 'category' AND p1.post_status = 'publish' AND terms1.term_id IN (".$args['categories'].") AND
			t2.taxonomy = 'post_tag' AND p2.post_status = 'publish'
			AND p1.ID = p2.ID
		ORDER by tag_name
	");
	$count = 0;
	foreach ($tags as $tag) {
		$tags[$count]->tag_link = get_tag_link($tag->tag_id);
		$count++;
	}
	return $tags;
}
// get tags for category (with children)

Вызываем эту функцию после в нужном шаблоне и нужном месте следующим образом:

$args = array(
        'categories'                => '12,13,14'
    );

$tags = get_category_tags($args);

12, 13, 14 — меняете на свои IDшники категорий, которые нужно вам показать.

Также в нашем случае необходимо было сделать вывод именно кастомных постов, по этому текущий код мы еще доработали:

// get tags for category (with children)
function get_category_tags($args) {
	global $wpdb;
	if(array_key_exists('post_type', $args)===false)
	{
		$args['post_type'] = "'post'";
	}
	
	$tags = $wpdb->get_results
	("
		SELECT DISTINCT terms2.term_id as tag_id, terms2.name as tag_name, null as tag_link
		FROM
			".$wpdb->prefix."posts as p1
			LEFT JOIN ".$wpdb->prefix."term_relationships as r1 ON p1.ID = r1.object_ID
			LEFT JOIN ".$wpdb->prefix."term_taxonomy as t1 ON r1.term_taxonomy_id = t1.term_taxonomy_id
			LEFT JOIN ".$wpdb->prefix."terms as terms1 ON t1.term_id = terms1.term_id,

			".$wpdb->prefix."posts as p2
			LEFT JOIN ".$wpdb->prefix."term_relationships as r2 ON p2.ID = r2.object_ID
			LEFT JOIN ".$wpdb->prefix."term_taxonomy as t2 ON r2.term_taxonomy_id = t2.term_taxonomy_id
			LEFT JOIN ".$wpdb->prefix."terms as terms2 ON t2.term_id = terms2.term_id
		WHERE
			t1.taxonomy = 'category' AND p1.post_status = 'publish' AND p1.post_type IN (".$args['post_type'].") AND terms1.term_id IN (".$args['categories'].") AND
			t2.taxonomy = 'post_tag' AND p2.post_status = 'publish' AND p2.post_type IN (".$args['post_type'].")
			AND p1.ID = p2.ID
		ORDER by tag_name
	");
	$count = 0;
	foreach ($tags as $tag) {
		$tags[$count]->tag_link = get_tag_link($tag->tag_id);
		$count++;
	}
	return $tags;
}
// get tags for category (with children)

Вызов функции теперь будет следующий для вывод тегой для кастомных постов:

<?$providers = get_category_tags(['categories' => $category_id, 'post_type' => '"game"']);?>

Использовать все это в теме можно следующим образом:

<?$providers = get_category_tags(['categories' => $category_id, 'post_type' => '"game"']);?>
		<?if(count($providers)):?>
		<nav class="providers">
			<?foreach($providers as $provider):?>
			<a href="<?=$provider->tag_link;?>"><?=$provider->tag_name;?></a>
			<?endforeach;?>
		</nav>
		<?endif;?>

Вывод тегов (tags) для кастомных постов (custom post type)

Всем привет.

У нас на проекте появилась задача сделать страницу в WordPress, где будут отображаться дополнительные параметры для кастомных типов записей. Грубо говоря — вывести все сущности одного типа, по которым фильтруются кастомные типы записей.

К примеру: у вас есть типа записей games. Условно говоря — это запись с игрой. Для каждой игры, помимо категории своей, есть также такой параметр, как «Провайдер» (Provider). Вот его мы решили хранить в базе, как тег для нашего custom_post_type => ‘game’.

И наша задача состоит в том, что нужно вывести на странице все провайдеры, у которых есть хоть одна запись типа «game». Получился код у нас следующий:

function get_terms_by_custom_post_type( $post_type, $taxonomy ){
	$args = array( 'post_type' => $post_type);
	$loop = new WP_Query( $args );
	$postids = array();
	// build an array of post IDs
	while ( $loop->have_posts() ) : $loop->the_post();
		array_push($postids, get_the_ID());
	endwhile;
	// get taxonomy values based on array of IDs
	$taxonomies = wp_get_object_terms( $postids,  $taxonomy );
	return $taxonomies;
}

Этот код работает. Все хорошо. Однако те, кто хорошо знает WordPress, заметит, что если эту функцию использовать, то сбиваются настройки для обьекта $post.

Для того, чтобы все работало как должно, нужно добавить еще одну строку:

	wp_reset_postdata();
В итоге у нас получился следующий код, который нужно добавить в файл functions.php для вашей темы:
function get_terms_by_custom_post_type( $post_type, $taxonomy ){
	$args = array( 'post_type' => $post_type);
	$loop = new WP_Query( $args );
	$postids = array();
	// build an array of post IDs
	while ( $loop->have_posts() ) : $loop->the_post();
		array_push($postids, get_the_ID());
	endwhile;
	// get taxonomy values based on array of IDs
	$taxonomies = wp_get_object_terms( $postids,  $taxonomy );
	wp_reset_postdata();
	return $taxonomies;
}

Использовать эту функцию необходимо следующим образом:

<?$providers = get_terms_by_custom_post_type('game', 'post_tag');?>

Наш код в итоге для вывода провайдеров получился следующим:

<?$providers = get_terms_by_custom_post_type('game', 'post_tag');?>
	
	<?if(count($providers)):?>
	<div class="games__body">
		<h1 class="entry-title text-center"><?=the_title();?></h1>
		<div class="games-providers__grid">
			<?foreach($providers as $provider):?>
			<a href="<?=get_term_link($provider, 'post_tag');?>" class="games-providers__item" id="<?=$provider->name;?>">
			</a>
			<?endforeach;?>
		</div>
	</div>
	<?endif;?>

Всем спасибо. Надеюсь будет полезна эта функция.