@avantus_rus

Как оптимизировать вывод рекомендуемых к прочтению материалов?

Есть сайт на WP. В статье, после текста, выводится блок рекомендуемых к прочтению статей. Выводятся они следующим образом:
  • 2 ссылки на предыдущие по порядку публикации статьи;
  • 2 ссылки на следующие по порядку публикации статьи;
  • 2 ссылки на предыдущие по порядку публикации статьи по меткам;
  • 2 ссылки на следующие по порядку публикации статьи по меткам;

При этом, если получается что по меткам и просто по порядку статьи дублируются, то из ссылок по порядку дублирующая убирается и берется следующая.

Сделал я так понабравшись обрывков информации в сети. Но подозреваю, что это получилось не очень производительно.

При выводе этого блока добавляется 23 запроса к БД (смотрел на определенной статье), потребление памяти увеличивается на 2.55МБ, время на 0.018 сек.

Количество запросов и прочее вывожу так: SQL - <?php echo get_num_queries (); ?> | <?php timer_stop (1); ?> сек. | <?php echo round (memory_get_usage ()/1024/1024, 2) ?> МБ

Гляньте ниже то, что я сделал, и дайте, пожалуйста, советы как это можно оптимизировать. А может, я зря беспокоюсь и всё так можно оставить?

<?php 
global $SMTheme;
if ($SMTheme->get( 'layout', 'related' )) { ?>
				<div class="related-posts"><p></p><ul>
		<?php
		$postid=$post->ID;
		$showed_posts=array();
		$tags=get_the_tags($postid);
		$categories = get_the_category($postid);
		$post_cnt=0;
		$first=0;
		if ($tags) {
			$tags_ids = array();
			foreach($tags as $tag) $tags_ids[] = $tag->term_id;
			$args1=array(
			'tag__in' => $tags_ids,
			'showposts'=>$SMTheme->get( 'layout', 'relatedcnt' ),
			'caller_get_posts'=>1);
			$posts1=get_posts($args1);
if(count($posts1)>4){
$number1 = 0;
for($i=0; $i<count($posts1); $i++)
{
	$item = $posts1[$i];
	if($item->ID==$post->ID) $number1 = $i;

}
$arr1 = array();
$array_id = array();

for($i=$number1; $i<count($posts1);$i++)
{
	$item = $posts1[$i];
	$arr1[] = $item;
	$array_id[] = $item->id;
	
}

for($i=0; $i<$number1;$i++)
{
	$item = $posts1[$i];
	$arr1[] = $item;
	$array_id[] = $item->id;
}

$massiv = array();

for($i=1; $i<3; $i++)
{
	$massiv[]= $arr1[$i]->ID;
	$r=rand(1,150);
	$g=rand(1,150);
	$b=rand(1,150);
	$thumb_id = get_post_thumbnail_id($arr1[$i]->ID);
    $thumb_url = wp_get_attachment_image_src($thumb_id,'thumbnail', true);
	$usl=get_post_meta($arr1[$i]->ID, '_yoast_wpseo_title', true);
	if($usl==null){$ankor=$arr1[$i]->post_title;}
	else{$ankor=$usl;}
	$prin1='<li><a href="'.get_permalink($arr1[$i]->ID).'" class="img related-ttl" style="background-image:url('.$thumb_url[0].');"><span class="related-bg" style="background:rgba('.$r.",".$g.",".$b.', 0.7)">'.$ankor.'</span></a></li>';
	print $prin1;
}

for($i=0; $i<2; $i++)
{   
    $arr11=array_reverse($arr1);
	$massiv[]= $arr11[$i]->ID;
	$r=rand(1,150);
	$g=rand(1,150);
	$b=rand(1,150);
	$thumb_id = get_post_thumbnail_id($arr11[$i]->ID);
    $thumb_url = wp_get_attachment_image_src($thumb_id,'thumbnail', true);
	$usl=get_post_meta($arr11[$i]->ID, '_yoast_wpseo_title', true);
	if($usl==null){$ankor=$arr11[$i]->post_title;}
	else{$ankor=$usl;}
	$prin1='<li><a href="'.get_permalink($arr11[$i]->ID).'" class="img related-ttl" style="background-image:url('.$thumb_url[0].');"><span class="related-bg" style="background:rgba('.$r.",".$g.",".$b.', 0.7)">'.$ankor.'</span></a></li>';
	print $prin1;
}

foreach($massiv as $v){
	    $massiv12[]=intval($v);
	}
	
}
		}
if (!empty($massiv12)){$massiv12=$massiv12;}
else {$massiv12=array(1);}

$category_ids = array();
			foreach($categories as $individual_category) $category_ids[] = $individual_category->term_id;
			$showed_posts[]=$postid;
			$args=array(
			'category__in' => $category_ids,
			'post__not_in' => $massiv12,
			'showposts'=>$SMTheme->get( 'layout', 'relatedcnt' ),
			'caller_get_posts'=>1);
			$posts=get_posts($args);
			
$number = 0;
for($i=0; $i<count($posts); $i++)
{
	$item = $posts[$i];
	if($item->ID==$post->ID) $number = $i;
}
$arr = array();
for($i=$number; $i<count($posts);$i++)
{
	$item = $posts[$i];
	$arr[] = $item;
}

for($i=0; $i<$number;$i++)
{
	$item = $posts[$i];
	$arr[] = $item;
}



for($i=1; $i<3; $i++)
{
	$r=rand(1,150);
	$g=rand(1,150);
	$b=rand(1,150);
	$thumb_id = get_post_thumbnail_id($arr[$i]->ID);
    $thumb_url = wp_get_attachment_image_src($thumb_id,'thumbnail', true);
	$prin='<li><a href="'.get_permalink($arr[$i]->ID).'" class="img related-ttl" style="background-image:url('.$thumb_url[0].');"><span class="related-bg" style="background:rgba('.$r.",".$g.",".$b.', 0.7)">'.$arr[$i]->post_title.'</span></a></li>';
	print $prin;
}

for($i=0; $i<2; $i++)
{   
    $arr111=array_reverse($arr);
	$r=rand(1,150);
	$g=rand(1,150);
	$b=rand(1,150);
	$thumb_id = get_post_thumbnail_id($arr111[$i]->ID);
    $thumb_url = wp_get_attachment_image_src($thumb_id,'thumbnail', true);
	$prin='<li><a href="'.get_permalink($arr111[$i]->ID).'" class="img related-ttl" style="background-image:url('.$thumb_url[0].');"><span class="related-bg" style="background:rgba('.$r.",".$g.",".$b.', 0.7)">'.$arr111[$i]->post_title.'</span></a></li>';
	print $prin;
}		
	
		
			?></ul></div>
	<?php } ?>
  • Вопрос задан
  • 193 просмотра
Пригласить эксперта
Ответы на вопрос 2
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
При этом, если получается что по меткам и просто по порядку статьи дублируются, то из ссылок по порядку дублирующая убирается и берется следующая.
А обратить логику - пробовали?!)
Ответ написан
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
Вы используете стандартные функции для доступа к постам в БД, включите кеширующий бекенд (Memcached, Redis) и все будет ок. Еще один вариант - использование Transients API для кеширования результата всех этих запросов сразу, например, на 1 день.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы