I’m trying to resolve the problem with event displaying.
An event has its start and end dates, written in meta. For example, event starts on (dmY) 03.04.2013 and ends up on 08.04.2013. Using WP_query
and meta_query
I can exclude this event if I am trying to get data by 09.04.2013.
At the same time this event will show up each day in the interval, that is cool too. But, I can’t really exclude this event if I’m trying to get data by 02.04.2013.
The interval I use is this month, I mean, for example from 01.04.2013 to 30.04.2013.
Here is the code.
In my particular situation I need XOR functionality for meta_relation
. The best way is to create a custom $wpdb
query, but I’m not too strong in MySQL….
//Week events
$query_date = $_GET['date'];
$month_start = date('Ym01',strtotime('this month'));
$month_end = date('Ymt',strtotime('this month'));
//IF query Day is empty
if ( empty($query_date) || ( strlen($query_date) != 8 ) || ( !is_numeric($query_date) ) ) {
//Custom query
$args = array(
'post_type' => 'post',
'orderby' => 'event_start_date',
'order' => 'ASC',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'event_start_date',
'value' => array( $month_start, $month_end),
'compare' => 'BETWEEN',
'type' => 'DATE'
),
array(
'key' => 'event_end_date',
'value' => array( $month_start, $month_end),
'compare' => 'BETWEEN',
'type' => 'DATE'
)
)
);
} else {
//Custom query
$args = array(
'post_type' => 'post',
'orderby' => 'event_start_date',
'order' => 'ASC',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'event_start_date',
'value' => array( $query_date, $month_end),
'compare' => 'BETWEEN',
'type' => 'DATE'
),
array(
'key' => 'event_end_date',
'value' => array( $query_date, $month_end),
'compare' => 'BETWEEN',
'type' => 'DATE'
)
)
);
}
$wp_query = new WP_Query( $args );
//End of custom query
Okay!
So, having spent all the night in order to find a right solution… finally.. I did it.
Here is the right method, that works in my situation.
The
$wpbd
method is pretty cool and complicated at the same time.While using this method do not forget to cache queries properly with
php-apc
ormemcache
.While doing some testings realized, that
XOR
logic operation does not work properly. So, I replaced XOR by a set:XOR = ( ( A AND NOT B ) OR ( NOT A AND B ) )
. This one works!