Похожие записи по количеству совпадающих тегов для WordPress без плагинов

Похожие записи по тегам для WordPress

На фото тройНяшки из Красноярска.

Недавно на своём новом WordPress сайте я решил сделать вывод похожих записей по тегам, но так как лень родилась раньше меня, то сразу полез в Гугл за готовым кодом. К сожалению, ни один из вариантов меня не устроил:

<?php
	global $post;
	$tax = 'post_tag';


	$obj_terms = wp_get_object_terms( $post->ID, $tax, array( 'fields' => 'ids' ) );
	$args = array(
		'posts_per_page' => 4,
		'tax_query' => array(
			array(
				'taxonomy' => $tax,
				'field' => 'id',
				'include_children' => false,
				'terms' => $obj_terms,
				'operator' => 'IN' // IN - если совпадает хотя бы одна метка, AND - если совпадают все метки
			)
		)
	);
	$new_query = new WP_Query( $args );


	if ( $new_query->have_posts() ) :
		echo '<h3>Похожие посты:</h3>';
		while ( $new_query->have_posts() ) : $new_query->the_post();
			echo '<a href="' . get_permalink( $new_query->post->ID ) . '">' . $new_query->post->post_title . '</a>';
		endwhile;
	endif;
	wp_reset_postdata();
?>

Большая часть ищет либо по всем совпадающим меткам, либо по одной из них. Оказалось, что в первом случае результатов может просто не быть, а во втором — выборка не совсем релевантна. Например, на постах с тегами «искусство», «картины» и «девушки» результаты могли быть со статуэтками, мужскими изображениями или фигурками женщин. Если вас это устраивает, то пожалуйста.

Чтобы исправить такое поведение пришлось написать своё решение. Теперь на первом месте будет стоять запись с наибольшим количеством совпадающих тегов, а на последнем, что логично, с наименьшим.

<?php
	global $wpdb;
	$spisok = "";
	$posttags = get_the_tags();
	if ( $posttags ) {
		foreach ( $posttags as $tag ) {
			$spisok .= "'" . $tag->name . "',";
		}
		$spisok = mb_substr($spisok, 0, mb_strlen($spisok) - 1);
	}
	$results = $wpdb->get_results( "SELECT rel.object_id, COUNT(*) AS tags_count FROM $wpdb->term_relationships AS rel, $wpdb->terms AS ter, $wpdb->term_taxonomy AS tax WHERE ter.term_id = rel.term_taxonomy_id AND ter.term_id = tax.term_taxonomy_id AND tax.taxonomy = 'post_tag' AND rel.object_id != " . get_the_id() . " AND ter.name IN (" . $spisok . ") GROUP BY rel.object_id ORDER BY tags_count DESC LIMIT 4" );
	if ( $results ) {
		echo '<ul class="tabs">';
		foreach ( $results as $res ) { ?>
			<li>
				<div class="tab-item-thumbnail">
					<a href="<?php the_permalink($res->object_id); ?>">
						<?php if ( has_post_thumbnail($res->object_id) ): ?>
							<?php echo get_the_post_thumbnail($res->object_id, array(75, 75)); ?>
						<?php else: ?>
							<img src="<?php echo get_template_directory_uri(); ?>/img/thumb-small.png" />
						<?php endif; ?>
					</a>
				</div>
				<div class="tab-item-inner group">
					<p class="tab-item-title"><?php echo get_the_title($res->object_id); ?></p>
				</div>
			</li>
<?php
		}
		echo "</ul>";
	}
?>

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

Кстати, а знаете что ещё вам лучше не забывать? Что наш чай — лучший выбор для всех программистов. Это аксиома.

Поделиться с друзьями
BadTea
Добавить комментарий