Afișarea articolelor din ultimele 7 zile
Încerc să afișez cele 5 articole cel mai bine cotate din ultima săptămână (7 zile) pe site-ul meu, dar nu reușesc să găsesc modalitatea corectă de a le afișa.
Iată ce am realizat până acum, dar nu pare să funcționeze:
<?php
// Interogare pentru 5 articole din categoria 3, ordonate după rating
$slider_query = new WP_Query('posts_per_page=5&cat=3&orderby=highest_rated&order=desc'); ?>
<?php
// Calculăm limita de 7 zile în secunde
$mylimit = 7 * 86400; //zile * secunde pe zi
while ($slider_query->have_posts()) : $slider_query->the_post();
// Calculăm vârsta articolului
$post_age = date('U') - get_post_time('U');
// Verificăm dacă articolul este mai recent de 7 zile
if ($post_age < $mylimit) {
?>
//Articolul
<?php } ?>
<?php endwhile;?>

Pe lângă soluția oferită de birgire, începând cu WordPress 3.7, poți folosi Parametrii de dată.
Argumentele tale ar arăta astfel pentru a filtra articolele din ultimele 7 zile:
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC',
// Folosim date_query pentru a filtra articolele din ultima săptămână
'date_query' => array(
array(
'after' => '1 week ago'
)
)
);

Cred că această problemă a fost rezolvată de multe ori aici pe WordPress Answers.
De asemenea, poți verifica exemplele din secțiunea Parametri de timp în Codex pentru WP_Query
.
Iată două dintre ele (ușor modificate pentru nevoile tale)
Exemplul 1:
// Creează o nouă funcție de filtrare care va adăuga clauza WHERE la interogare
function filter_where( $where = '' ) {
// postări din ultimele 7 zile
$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' );
Exemplul 2:
// Creează o nouă funcție de filtrare care va adăuga clauza WHERE la interogare
function filter_where( $where = '' ) {
// postări între 1 mai și 8 mai 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' )
presupunând că ai acest orderby=highest_rated
acoperit prin intermediul unui plugin, așa cum ai menționat în comentariul de mai sus.

Mă întreb dacă 'date_query' este mai bine de utilizat? Prin adăugarea următoarelor argumente în wp_query: 'date_query' => array( array('after' => '1 week ago')

Din secțiunea WP_Query
Parametri de Timp:
Returnează postări doar pentru săptămâna curentă:
$week = date('W');
$year = date('Y');
$query = new WP_Query( 'year=' . $year . '&w=' . $week );

Bună. Nu am testat asta încă, dar sunt destul de sigur că nu este exact ceea ce caut. Aceasta probabil listează postările publicate în săptămâna 13, de exemplu. Ceea ce vreau eu sunt postările care au fost publicate în ultimele 7 zile. De exemplu, de miercuri 8 mai până miercuri 1 mai.

Pentru mine funcționează astfel, pentru a afișa postările din ultimele 7 zile în funcție de numărul de vizualizări și ordonate după numărul de vizualizări DESC.
$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 );

poți folosi simplu wp_get_archives()
wp_get_archives( array( 'type' => 'weekly', 'limit' => 1, 'show_post_count' => 'true' ,'format'=>'option') ); ?>

Utilizare mai simplă a interogării SQL cu hook-ul 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;
}
