WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

Сортировка постов на главной странице

Пытаюсь сделать подобный вывод постов

Здесь планируется вывод последних записей из всех категорий(т.е получается сортировка по дате)
Код

<?while(have_posts()): the_post();?>
<article itemscope itemtype="http://schema.org/Article">
<div class="post">
		 <a class="full-post" href="<?php the_permalink();?>">
<?php
$args = array(
	'post_type'   => 'attachment',
	'numberposts' => 1,
	'post_status' => null,
	'post_parent' => $post->ID,
	'exclude'     => get_post_thumbnail_id()
	);
$attachments = get_posts( $args );
if ( $attachments ) :
	foreach ( $attachments as $attachment ) {
		echo wp_get_attachment_image( $attachment->ID, 'full', false, array ("class" => "img img-fluid img-thumbnail"));
	};
else:
   print '<img class="img img-fluid img-thumbnail" src="'. get_bloginfo('template_directory'). '/images/no_image.jpg' . '" alt="no image" />';
endif;
?></a>
	<div class="post-block">
		<span class="post-title">
		<a  href="<?php the_permalink();?>"><?php the_title();?></a>
		</span>
			<div class="post-info">
			<span><i class="fa fa-calendar"></i><?php the_time('j F Y');?></span>
			<span><i class="fa fa-user"></i><?php the_author(); ?></span>
			<span><i class="fa fa-eye"></i><?php echo get_post_meta( $post->ID, 'views', true ); ?></span>
			</div>
		<?php the_excerpt();?>
	   </div>
</div>
<meta itemprop="author" content="<?php the_author(); ?>">
</article>
<?endwhile;?>

Как прикрутить эту самую сортировку не могу понять.
Хотелось бы конкретный пример какой код куда вставить.
В планах сортировка по дате,кол-ву комментов,кол-ву просмотров .

0
AHristich
3 года назад
  • 1

    У неиерархических типов записей сортировка по дате включена по умолчанию. Разве нет?

    Изменить параметры запроса основного цикла можно через функцию, подключенную на хук pre_get_posts.

    Обратите внимание, что при написании пользовательской функции для этого хука нужно обязательно проверять, где будет выполняться код. Иначе могут быть неожиданные результаты.

    В случае с сортировкой постов функция будет выглядеть как-то так:

    add_action( 'pre_get_posts', 'custom_orderby' );
    function custom_orderby( $query ) {
    	if ( $query->is_front_page() && $query->is_main_query() ) {
    		$query->set( 'orderby', 'date' ); // comment_count (признак, по которому сортируются записи )
    		$query->set( 'order', 'DESC' ); // ASC (порядок)
    	}
    }

    Разумеется, что такой код надо размещать в functions.php

    Если речь идет о внутреннем цикле, то добавьте orderby и order в массив параметров запроса. Описание всех параметров - https://wp-kama.ru/function/wp_query

    Сортировка по произвольному полю описывается в параметрах запроса так:

    'orderby' => 'meta_value',
    'meta_key' => 'имя поля'
    AHristich 3 года назад

    Вроде бы как с горем пополам разобрался,кажется...почти.
    Вывод по кол-ву комментов:

    <?php
    $args = array(
    	'posts_per_page' => 3,
    		'comment_count' => [
    		'value'   => 1,
    		'compare' => '>=',
    	],
    );
    $query = new WP_Query( $args ); ?>
    <?php if ( $query->have_posts() ) : ?>
    <?php while ( $query->have_posts() ) : $query->the_post(); ?>

    За последнюю неделю:

    <?php
    $week = date('W');
    $year = date('Y');
    $args = array(
    'year=' . $year . '&w=' . $week,
    	'posts_per_page' => 5,
    );
    $query = new WP_Query( $args ); ?>
    <?php if ( $query->have_posts() ) : ?>
    <?php while ( $query->have_posts() ) : $query->the_post(); ?>

    Но я так понял что в стандарте нет сортировки по кол-ву просмотров.
    Кол-во просмотров поста сделано через функцию:

    add_action( 'wp_head', 'rh_postviews' );
    function rh_postviews( $args = [] ){
    	global $user_ID, $post, $wpdb;
    	if( ! $post || ! is_singular() )
    		return;
    	$rg = (object) wp_parse_args( $args, [
    		'meta_key' => 'views',
    		// Кого считать? 0 - Всех. 1 - Только гостей. 2 - Только зарегистрированных пользователей.
    		'who_count' => 0,
    		// Исключить ботов, роботов? 0 - нет, пусть тоже считаются. 1 - да, исключить из подсчета.
    		'exclude_bots' => true,
    	] );
    	$do_count = false;
    	switch( $rg->who_count ){
    		case 0:
    			$do_count = true;
    			break;
    		case 1:
    			if( ! $user_ID )
    				$do_count = true;
    			break;
    		case 2:
    			if( $user_ID )
    				$do_count = true;
    			break;
    	}
    	if( $do_count && $rg->exclude_bots ){
    		$notbot = 'Mozilla|Opera'; // Chrome|Safari|Firefox|Netscape - все равны Mozilla
    		$bot = 'Bot/|robot|Slurp/|yahoo';
    		if(
    			! preg_match( "/$notbot/i", $_SERVER['HTTP_USER_AGENT'] ) ||
    			preg_match( "~$bot~i", $_SERVER['HTTP_USER_AGENT'] )
    		){
    			$do_count = false;
    		}
    	}
    	if( $do_count ){
    		$up = $wpdb->query( $wpdb->prepare(
    			"UPDATE $wpdb->postmeta SET meta_value = (meta_value+1) WHERE post_id = %d AND meta_key = %s", $post->ID, $rg->meta_key
    		) );
    		if( ! $up )
    			add_post_meta( $post->ID, $rg->meta_key, 1, true );
    		wp_cache_delete( $post->ID, 'post_meta' );
    	}
    }

    Делаю так:

    $args = array(
    	'posts_per_page' => 1,
    'meta_query' => [
    	'key' => 'views',
    	'meta_value' => '10',
    	'compare_key' => '>=', 
    ],
    );

    Но такое ощущение что не работает,потому что два поста на тест-сайте,у первого 11просмотров у второго 9,и выводится все-равно второй пост независимо от значения в 'meta_value'.
    Чет я не догоняю уже или одно из двух...

    Andrew 3 года назад

    внимательно почитайте описание параметров запроса https://wp-kama.ru/function/wp_query

    в первом случае получаются посты, у которых _есть_ комментарии (больше или равно 1). Чтобы получить самый комментируемый пост, добавьте сортировку по комментариям
    'orderby' => 'comment_count', 'order' => 'DESC'
    и установите ограничение в posts_per_page = 1

    Но такое ощущение что не работает

    Работает, но не так как вы хотите.

    в массиве 'meta_query' нет параметра 'meta_value'. Есть просто 'value'. meta_value это старый параметр, используется в основном массиве параметров.

    Чтобы отсортировать посты по произвольному полю и получить только самый просматриваемый пост, нужно запрос составить так:

    $args = array(
    	'posts_per_page' => 1,
    	'meta_key'   => 'views',
    	'orderby'    => 'meta_value_num',
    	'order'      => 'DESC',
    );
    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация