I would use together meta_query and date_query but it seems it's not possible .
What I'm looking to do : (display next 12 month from current month) : for each
- April 2023
If date range event (start and end) is between 1st day of month and last day of month display only these events.
- Mai
same thing
until March 2024
If month doesn't not have posts then display "No event this month". Considering the range of date event this one can be displayed on multiple month.
Currently :
I have 4 active posts
My code display well events from start and end by month , but I can't do "else" condition to display "No event this month" because arguments of query are called for each month.
My reasoning was : if generated month ($months[$I]) correspond to one of date->month event (start and end) then display number of post for this month else display "No event this month" but I don't know how to get an array of start timestamp event to compare them to this generated month. Also "for" (generated month) loop it's done before wp loop.
Is it better to do one wp_query and then filter or do a loop wp_query for each month with specific arguments (for last one I can't do this) ?
$argslistyear = array(
'post_type' => 'liste_associations',
'post_status' => 'publish',
'posts_per_page' => -1,
'meta_key' =>'start_timestampevents',
'orderby' => 'meta_value_num',
'order' => 'ASC',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'end_timestampevents',
'value' => array($datestart,$dateend),
'compare' => 'BETWEEN',
'type' => 'NUMERIC'
),
array(
'key' => 'start_timestampevents',
'value' => array($datestart,$dateend),
'compare' => 'BETWEEN',
'type' => 'NUMERIC'
)
)
/*
,'date_query' => array(
array(
'after' => strtotime($FirstDayThisMonth[$i]),
'before' => strtotime($LastDayThisMonth[$i]),
//'inclusive' => true,
),
)
*/
);
$postsListYear = new WP_Query($argslistyear);
Currently my filter by month is :
add_action('wp_ajax_nopriv_filter_date', 'filter_ajax_date');
add_action('wp_ajax_filter_date', 'filter_ajax_date');
function filter_ajax_date(){
if($postdaterange == 'listyear' ) :
$months = array(); $FirstDayThisMonth = array(); $LastDayThisMonth =array();
$currentMonth = (int)date('m');
setlocale(LC_TIME, 'fr_FR');
date_default_timezone_set('Europe/Paris');
for ($x = $currentMonth; $x < $currentMonth + 12; $x++) {
$months[] = date('F', mktime(0, 0, 0, $x, 1));
$FirstDayThisMonth[] = date('Y-m-01 00:00:01', mktime(0, 0, 0, $x, 1));
$LastDayThisMonth[] = date('Y-m-t 23:59:59', mktime(0, 0, 0, $x, 1));
}
for($i = 0; $i < 12; $i++) : // loop 12 months
$monthinfrench = str_replace( $EnglishMth,$FrenchMth, date($FormatMth, strtotime($months[$i])));
?>
<ListMonth>
<span ><?= $monthinfrench; ?></span>
if($postsListYear->have_posts()) : while ($postsListYear->have_posts()): $postsListYear->the_post(); // loop all posts
if($months[$i] == $TheStartMonth || $months[$i] == $TheEndMonth ) :
elseif($months[$i] !== $TheStartMonth) : echo 'No event this month'; // error = this display 4 times -> 4 existing posts
//endif; // interval (1st day of month & start event) & (last day of month & end event )
endif; // events of month
endwhile; //endwhile $post
endif; //endif $post;
?>
</ListMonth>
<?php
endfor; //12 month
wp_reset_query();
wp_die();
endif; // Only Listyear
}// function filter_ajax_date
$i
come from? What's the raw values/format ofstart_timestampevents
andend_timestampevents
in post meta? Does this work with the date_query uncommented and the meta_query commented out? How are you testing the result? Where do$datestart
and$dateend
come from and what are their formats/values? Please use the edit link under the tags to edit this information into your question as well as anything else that might be relevant to avoid additional questions, avoid posting code in comments$FirstDayThisMonth[] = date('Y-m-01 00:00:01', mktime(0, 0, 0, $x, 1)); $LastDayThisMonth[] = date('Y-m-t 23:59:59', mktime(0, 0, 0, $x, 1));
instead of :$datestart = strtotime(date('Y-'.$nbofmonth.'-01 00:00:01')); $dateend = strtotime(date('Y-'.$nbofmonth.'-t 23:59:59'));
It's always very annoying to have well written code and to realize that a small element breaks everythingdate_default_timezone_set
is very bad and messes with WordPress' internal functions. In WP all dates and times should be saved as UTC timestamps, not relative times in timezones. Is your last comment saying that you've found and fixed the error? If you have found the solution you should write it below in the answer box so that people know you've solved it, comments are just for clarifying questions