XOR-functionalität für Metaabfrage

Ich versuche das Problem mit der Ereignisanzeige zu lösen.

Ein Ereignis hat sein Anfangs- und Enddatum, das in Meta geschrieben ist. Beispiel: Das Ereignis beginnt am (dmY) 03.04.2013 und endet am 08.04.2013. Mit WP_query und meta_query kann ich dieses Ereignis ausschließen, wenn ich bis 09.04.2013 Daten abrufen möchte.

Gleichzeitig wird diese Veranstaltung jeden Tag im Intervall erscheinen, das ist auch cool. Aber ich kann dieses Ereignis nicht wirklich ausschließen, wenn ich versuche, Daten bis zum 02.04.2013 zu bekommen.
Das Intervall, das ich benutze, ist in diesem Monat, ich meine zum Beispiel vom 01.04.2013 bis zum 30.04.2013.

Hier ist der Code.
In meiner speziellen Situation brauche ich XOR-functionalität für meta_relation . Der beste Weg ist, eine benutzerdefinierte $wpdb Abfrage zu erstellen, aber ich bin nicht zu stark 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 

Solutions Collecting From Web of "XOR-functionalität für Metaabfrage"

Okay! Also, die ganze Nacht verbracht, um eine richtige Lösung zu finden … endlich … ich habe es geschafft. Hier ist die richtige Methode, die in meiner Situation funktioniert.

Die $wpbd Methode ist ziemlich cool und kompliziert zugleich. Vergessen Sie während der Verwendung dieser Methode nicht, Abfragen mit php-apc oder memcache korrekt zwischenzuspeichern.

Während einige Tests durchgeführt wurden, funktioniert diese XOR Logikoperation nicht richtig. Also habe ich XOR durch eine Menge ersetzt: XOR = ( ( A AND NOT B ) OR ( NOT A AND B ) ) . Dieser funktioniert!

 //Week events $query_date = $_GET['date']; $month_start = date('Ym01',strtotime('this month')); $month_end = date('Ymt',strtotime('this month')); $pm1_meta_key = 'event_start_date'; $pm2_meta_key = 'event_end_date'; //IF query Day is empty if ( empty($query_date) ) { //Custom query $postids = $wpdb->get_col( $wpdb->prepare( " SELECT p.* FROM $wpdb->posts p JOIN $wpdb->postmeta pm1 ON (p.ID = pm1.post_id) JOIN $wpdb->postmeta pm2 ON (p.ID = pm2.post_id) WHERE p.post_type = 'post' AND p.post_status = 'publish' AND ( ( pm1.meta_key ='%1\$s' AND CAST( pm1.meta_value AS DATE) BETWEEN %3\$d AND %4\$d ) OR ( pm2.meta_key = '%2\$s' AND CAST( pm2.meta_value AS DATE ) BETWEEN %3\$d AND %4\$d ) ) ", $pm1_meta_key, $pm2_meta_key, $month_start, $month_end )); $args = array( 'post__in' => $postids, 'meta_key' => 'event_start_date', 'orderby' => 'meta_value_num', 'order' => 'ASC' ); } else { //Date $query_date = date('Ymd', strtotime($query_date)); $query_date_month = date('m', strtotime($query_date)); //If future month if ( $query_date_month > date('m') ) { $month_end = date('Ymt', mktime(0, 0, 0, $query_date_month, 1, date('y'))); } //Custom query $postids = $wpdb->get_col( $wpdb->prepare( " SELECT p.* FROM $wpdb->posts p JOIN $wpdb->postmeta pm1 ON (p.ID = pm1.post_id) JOIN $wpdb->postmeta pm2 ON (p.ID = pm2.post_id) WHERE p.post_type = 'post' AND p.post_status = 'publish' AND ( ( ( pm1.meta_key = '%1\$s' AND CAST( pm1.meta_value AS DATE) BETWEEN %3\$d AND %4\$d ) AND ( pm2.meta_key = '%2\$s' AND CAST( pm2.meta_value AS DATE ) NOT BETWEEN %3\$d AND %4\$d ) ) OR ( ( pm1.meta_key = '%1\$s' AND CAST( pm1.meta_value AS DATE) NOT BETWEEN %3\$d AND %4\$d ) AND ( pm2.meta_key = '%2\$s' AND CAST( pm2.meta_value AS DATE ) BETWEEN %3\$d AND %4\$d ) ) ) OR ( pm1.meta_key = '%1\$s' AND CAST( pm1.meta_value AS DATE) = %3\$d ) ", $pm1_meta_key, $pm2_meta_key, $query_date, $month_end ) ); $args = array( 'post__in' => $postids, 'meta_key' => 'event_start_date', 'orderby' => 'meta_value_num', 'order' => 'ASC' ); } $wp_query = new WP_Query( $args ); //End of custom query