Перелинковка статей в WordPress (предыдущие записи из категории)

В догонку к теме от Kama, немного доработанная под себя функция:

<?php $pid = $post->ID; $pdat = $post->post_date ?>
<?php raft_perpost($pid, $pdat, 'prod_cat', 'prod'); ?>

function raft_perpost($pid, $pdat, $ptax='category', $ptype='post', $pnum=3){
	global $wpdb;

	$tax_id = "SELECT term_id FROM $wpdb->term_relationships rl LEFT JOIN $wpdb->term_taxonomy tx ON (rl.term_taxonomy_id = tx.term_taxonomy_id) WHERE object_id = {$pid} AND tx.taxonomy = '$ptax' LIMIT 1";
	$same_join = "SELECT ID, post_title, post_date, comment_count, guid
	FROM $wpdb->posts p
		LEFT JOIN $wpdb->term_relationships rel ON (p.ID = rel.object_id)
		LEFT JOIN $wpdb->term_taxonomy tax ON (rel.term_taxonomy_id = tax.term_taxonomy_id)";
	$same_and = "AND tax.term_id = ($tax_id)
		AND tax.taxonomy = '$ptax'
		AND p.post_status = 'publish'
		AND p.post_type = '$ptype'
		ORDER BY p.post_date DESC";
	$sql = "$same_join
	WHERE p.post_date < '{$pdat}'
		$same_and
	LIMIT $pnum";
	$res = $wpdb->get_results($sql);

	$count_res = count($res);
	// если количество меньше нужного, делаем 2-й запрос (кольцевая перелинковка)
	if ( !$res || $count_res<$pnum ){
		foreach ($res as $id)
			$exclude .= ','.$id->ID;
		$sql = "$same_join
		WHERE p.ID NOT IN ({$pid}{$exclude})
			$same_and
		LIMIT ".($pnum-$count_res);
		$res2 = $wpdb->get_results($sql);

		$res = array_merge($res,$res2);
	}
	if (!$res) return false;
	$i=1;
	foreach ($res as $pst){ ?>

					<div class="post_list<?php if ($i==3) { ?> post_list_last<?php } $i++; ?>">
						<?php echo raft_post_img_wp($pst->ID, 1, 1, 'img170', '<div class="post_list_img">', '</div>'); ?>
						<div class="post_list_r">
							<div class="post_list_t"><a href="<?php echo get_permalink($pst->ID); ?>"><?php echo $pst->post_title; ?></a></div>
							<div class="post_list_cat"><?php $ci=1; $terms = get_the_terms( $pst->ID, 'tipblud' ); if ( $terms ) { foreach( $terms as $tmn ) { if ($ci>1) { echo ', '; } $ci++; echo $tmn->name;  } } ?></div>
							<div class="post_list_com"><?php echo get_comments_number( $pst->ID ); ?></div>
							<div class="clear"></div>
						</div>
						<div class="clear"></div>
					</div>

	<?php }
}

 

Старый вариант

function raft_perpost($post_num=5){
	$echo=true;
	global $post, $wpdb;
	$cache_key = (string) md5( __FUNCTION__ . $post->ID );
	$cache_flag = __FUNCTION__;
	if ( $cache && $cache_out = wp_cache_get($cache_key, $cache_flag) ){
		if ($echo) return print($cache_out);
		else return $cache_out;
	}
	$cat = get_the_category($post->ID);
	$cat_id = (int) $cat[0]->term_id;
	$same_join = "SELECT ID, post_content, post_title, post_date, comment_count, guid FROM $wpdb->posts p LEFT JOIN $wpdb->term_relationships rel ON (p.ID = rel.object_id) LEFT JOIN $wpdb->term_taxonomy tax ON (rel.term_taxonomy_id = tax.term_taxonomy_id)";
	$same_and = "AND tax.term_id = '$cat_id' AND tax.taxonomy = 'category' AND p.post_status = 'publish' AND p.post_type = 'post'";
	$sql = "$same_join WHERE p.ID < {$post->ID} $same_and ORDER BY p.post_date DESC LIMIT $post_num";
	$res = $wpdb->get_results($sql);
	$count_res = count($res);
	if ( !$res || $count_res<$post_num ){
		$exclude = $post->ID;
		if ($res) foreach ($res as $id) $exclude .= ','.$id->ID;
		$post_num = (int) $post_num-$count_res;
		$sql = "$same_join WHERE p.ID NOT IN ($exclude) AND p.ID != {$post->ID} $same_and ORDER BY p.post_date DESC LIMIT $post_num";
		$res2 = $wpdb->get_results($sql);
		$res = array_merge($res,$res2);
	}
	if (!$res) return false;
	if ($format) preg_match ('!{date:(.*?)}!',$format,$date_m);
	$i=1;
	foreach ($res as $pst){

		if ($i==3) {
			$out .= '<div class="perpost perpostlast">';
		} else {
			$out .= '<div class="perpost">';
		}

			$out .= '<div class="perposttitle"><a href="'. get_permalink($pst->ID) .'">'. $pst->post_title .'</a></div>';
			$out .= '<div class="perpostdate">'. mysql2date('d.m.Y',  $pst->post_date) . '</div>'; 
			$out .= '<div class="perpostcat">'. get_the_category_list( ', ' ). '</div>'; 
			$out .= '<div class="perpostcomm"><a href="'. get_comments_link($pst->ID) .'">'. get_comments_number($pst->ID) .'</a></div>'; 
			$out .= '<div class="perpostrait">'. the_ratings_results($pst->ID). '</div>'; 
			$text = get_post_meta($pst->ID, 'views', true); if($text != '') {
				$out .= '<div class="perpostviews">'. $text .'</div>'; 
			}
			$text = raft_post_img($pst->ID, 1, 1, 257, 155); if($text != '') {
				$out .= '<div class="perpostimg">'. $text .'</div>'; 
			}
			$out .= '<div class="perposttext">'. raft_announce($pst->post_content, 200) .'</div>';
		$out .= '<div class="clear"></div></div>';
		if ($i==3) {
			$out .= '<div class="clear"></div>';
		}
		$i++; if ($i==4) { $i=1; }

	}
	if ($cache) wp_cache_add($cache_key, $out, $cache_flag);
	if ($echo) echo $out;
	else return $out;
}

Вставка в шаблон:

<?php raft_perpost(5); ?>
Запись опубликована в рубрике php, WordPress, Мои функции с метками . Добавьте в закладки постоянную ссылку.

2 комментария: Перелинковка статей в WordPress (предыдущие записи из категории)

  1. Дмитрй говорит:

    пишет ошибку определения функции
    the_ratings_results

    • Raft говорит:

      У вас просто не стоит плагин wp-postratings. Тут перечислены разные функции для разных плагинов, ели какая-то не работает у вас значит не стоит плаг — просто убираете эту функцию.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *