Сортировка постов на главной странице
Пытаюсь сделать подобный вывод постов
Здесь планируется вывод последних записей из всех категорий(т.е получается сортировка по дате)
Код
<?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;?>
Как прикрутить эту самую сортировку не могу понять.
Хотелось бы конкретный пример какой код куда вставить.
В планах сортировка по дате,кол-ву комментов,кол-ву просмотров .

У неиерархических типов записей сортировка по дате включена по умолчанию. Разве нет?
Изменить параметры запроса основного цикла можно через функцию, подключенную на хук 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Сортировка по произвольному полю описывается в параметрах запроса так:
Вроде бы как с горем пополам разобрался,кажется...почти.
Вывод по кол-ву комментов:
За последнюю неделю:
<?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' ); } }Делаю так:
Но такое ощущение что не работает,потому что два поста на тест-сайте,у первого 11просмотров у второго 9,и выводится все-равно второй пост независимо от значения в 'meta_value'.
Чет я не догоняю уже или одно из двух...
внимательно почитайте описание параметров запроса https://wp-kama.ru/function/wp_query
в первом случае получаются посты, у которых _есть_ комментарии (больше или равно 1). Чтобы получить самый комментируемый пост, добавьте сортировку по комментариям
'orderby' => 'comment_count', 'order' => 'DESC'и установите ограничение в posts_per_page = 1
Работает, но не так как вы хотите.
в массиве 'meta_query' нет параметра 'meta_value'. Есть просто 'value'. meta_value это старый параметр, используется в основном массиве параметров.
Чтобы отсортировать посты по произвольному полю и получить только самый просматриваемый пост, нужно запрос составить так: