Отображение записей за последние 7 дней
Я пытаюсь отобразить 5 самых рейтинговых записей за последнюю неделю (7 дней) на моем сайте, однако не могу понять, как их правильно вывести.
Вот что у меня получилось на данный момент, но это не работает:
<?php $slider_query = new WP_Query('posts_per_page=5&cat=3&orderby=highest_rated&order=desc'); ?>
<?php
$mylimit = 7 * 86400; // дни * количество секунд в дне
while ($slider_query->have_posts()) : $slider_query->the_post();
$post_age = date('U') - get_post_time('U');
if ($post_age < $mylimit) {
?>
//Запись
<?php } ?>
<?php endwhile;?>

В дополнение к решению birgire, начиная с WordPress 3.7, вы можете использовать Параметры даты.
Ваши аргументы будут выглядеть следующим образом для фильтрации записей за последние 7 дней:
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC',
// Используем date_query для фильтрации записей за последнюю неделю
'date_query' => array(
array(
'after' => '1 week ago'
)
)
);

Думаю, это уже много раз обсуждалось здесь в WordPress Answers.
Вы также можете посмотреть примеры в разделе Time parameters в Codex для WP_Query
.
Вот два из них (слегка адаптированные под ваши нужды)
Пример 1:
// Создаем функцию фильтрации, которая добавит условие WHERE в запрос
function filter_where( $where = '' ) {
// записи за последние 7 дней
$where .= " AND post_date > '" . date('Y-m-d', strtotime('-7 days')) . "'";
return $where;
}
add_filter( 'posts_where', 'filter_where' );
$slider_query = new WP_Query('posts_per_page=5&cat=3&orderby=highest_rated&order=desc');
remove_filter( 'posts_where', 'filter_where' );
Пример 2:
// Создаем функцию фильтрации, которая добавит условие WHERE в запрос
function filter_where( $where = '' ) {
// записи с 1 мая по 8 мая 2013 года
$where .= " AND post_date >= '2013-05-01' AND post_date < '2013-05-8'";
return $where;
}
add_filter( 'posts_where', 'filter_where' );
$slider_query = new WP_Query('posts_per_page=5&cat=3&orderby=highest_rated&order=desc');
remove_filter( 'posts_where', 'filter_where' )
при условии, что у вас реализована сортировка orderby=highest_rated
через какой-либо плагин, как вы упомянули в комментарии выше.

Интересно, будет ли лучше использовать 'date_query'? Добавив следующее в аргументы wp_query: 'date_query' => array( array('after' => '1 week ago')

Из раздела Параметры времени в WP_Query
:
Возвращает записи только за текущую неделю:
$week = date('W');
$year = date('Y');
$query = new WP_Query( 'year=' . $year . '&w=' . $week );

Для меня это работает следующим образом, чтобы показать посты за последние 7 дней в соответствии с количеством просмотров и отсортировать по убыванию количества просмотров.
$date_range = strtotime ( '-7 day' );
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => '10',
'meta_key' => 'post_views_count',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'date_query' => array(
array(
'after' => array(
'year' => date('Y', $date_range ),
'month' => date('m', $date_range ),
'day' => date('d', $date_range ),
),
)
)
);
$query = new WP_Query( $args );

вы можете просто использовать wp_get_archives()
wp_get_archives( array( 'type' => 'weekly', 'limit' => 1, 'show_post_count' => 'true' ,'format'=>'option') ); ?>

Более простое использование SQL-запроса с хуком WordPress posts where
function getStartAndEndDate($week, $year) {
$dto = new DateTime();
$dto->setISODate($year, $week);
$ret['week_start'] = $dto->format('Y-m-d');
$dto->modify('+6 days');
$ret['week_end'] = $dto->format('Y-m-d');
return $ret;
}
add_filter( 'posts_where', 'wpse29897_no_parents', 10, 2 );
function wpse29897_no_parents( $where, $query )
{
if( isset( $query->query_vars['post_type'] ) && 'menu_plans' == $query->query_vars['post_type'] )
{
if( '' != $where )
{
$currentdate = date('Y-m-d');
$currdate = new DateTime($currentdate);
if($_GET['weekchk']){
$currentweek = $_GET['weekchk'];
}else{
$currentweek = $currdate->format("W");
}
$week_array = getStartAndEndDate($currentweek,date('Y'));
$ws = "'".$week_array['week_start']."'";
$we = "'".$week_array['week_end']."'";
$where .= " AND post_date >= ".$ws." AND post_date < ".$we."";
}
else
{
$where .= " AND post_date >= '2020-07-28' AND post_date < '2020-08-4'";
}
}
return $where;
}
