Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- add_action( 'pre_get_posts', 'date_archive_query' );
- function date_archive_query( $query ) {
- if ( !is_admin() && $query->is_main_query() ) {
- // not an admin page and is the main query
- if ( is_date() ) {
- // date archive
- $dates = get_start_and_end_date();
- $reset_query_vars = array(
- 'second' , 'minute', 'hour',
- 'day', 'monthnum', 'year',
- 'w', 'm',
- );
- // reset date query vars
- foreach ( $reset_query_vars as $var ) {
- $query->set( $var, '' );
- }
- $query->set( 'post_type', 'post' );
- $query->set( 'posts_per_page', 10 );
- $query->set( 'meta_key', 'event_start_date' );
- $query->set( 'orderby', 'meta_value_num' );
- $query->set( 'order', 'ASC' );
- $meta_query = array(
- 'relation' => 'AND',
- // needs to be two meta key arrays
- array(
- 'key' => 'event_end_date',
- 'compare' => '<=',
- 'value' => $dates['end_date'],
- 'type' => 'DATE'
- ),
- array(
- 'key' => 'event_start_date',
- 'compare' => '>=',
- 'value' => $dates['start_date'],
- 'type' => 'DATE'
- ),
- );
- $query->set( 'meta_query', $meta_query );
- // add the filter
- add_filter( 'get_meta_sql', 'get_meta_sql_date', 10, 2 );
- // remove the filter down the road
- add_filter( 'the_posts', 'remove_get_meta_sql_filter' );
- }
- }
- }
- function get_start_and_end_date() {
- //check what type of date archive we are on and if query vars are available
- $m = ( get_query_var( 'm' ) ) ? get_query_var( 'm' ) : false;
- $year = ( get_query_var( 'year' ) ) ? get_query_var( 'year' ) : false;
- $month = ( get_query_var( 'monthnum' ) ) ? zeroise( get_query_var( 'monthnum' ), 2 ) : false;
- $day = ( get_query_var( 'day' ) ) ? get_query_var( 'day' ) : false;
- if ( $m ) {
- // Custom permalinks structure is not enabled
- switch ( strlen( $m ) ) {
- case 4: // Yearly
- $year = substr( $m, 0, 4 );
- break;
- case 6: // Monthly
- $year = substr( $m, 0, 4 );
- $month = substr( $m, 4, 2 );
- break;
- case 8: // Daily
- $year = substr( $m, 0, 4 );
- $month = substr( $m, 4, 2 );
- $day = substr( $m, 6, 2 );
- break;
- }
- }
- if ( is_year() && $year ) {
- $start_date = $year . '0101';
- $end_date = $year . '1231';
- }
- if ( is_month() && $year && $month ) {
- $start_date = $year . $month . '01';
- $end_date = date( 'Ymt', mktime( 23, 59, 59, $month, 1, $year ) ); // 't' gets the last day
- }
- if ( is_day() && $year && $month && $day ) {
- $start_date = $year . $month . $day;
- $end_date = $start_date;
- }
- return compact( 'start_date', 'end_date' );
- }
- // sortable posts by custom date field for long period events
- function get_meta_sql_date( $pieces, $queries ) {
- global $wpdb;
- $event_start_date = $event_end_date = '';
- // get start and end date from query
- foreach ( $queries as $q ) {
- if ( !isset( $q['key'] ) ) {
- return $pieces;
- }
- if ( 'event_start_date' === $q['key'] ) {
- $event_start_date = isset( $q['value'] ) ? $q['value'] : '';
- }
- if ( 'event_end_date' === $q['key'] ) {
- $event_end_date = isset( $q['value'] ) ? $q['value'] : '';
- }
- }
- if ( ( '' === trim( $event_start_date ) ) || ( '' === trim( $event_end_date ) ) ) {
- return $pieces;
- }
- // Match all meta table aliases with their meta keys (wp_postmeta or mt1, mt2 etc..).
- $pattern = "/($wpdb->postmeta|mt\d+)\.meta_key\s*=\s*'(event_start_date|event_end_date)'/";
- preg_match_all( $pattern , $pieces['where'], $matches );
- if ( !( isset( $matches[1] ) && isset( $matches[2] ) ) ) {
- return $pieces;
- }
- if ( empty( $matches[1] ) || empty( $matches[2] ) ) {
- return $pieces;
- }
- $query = $start_prefix = $end_prefix = '';
- $prefix = $keys = array();
- // count is 3 with 'orderby' and a 'meta_key'
- if ( ( 3 === count( $matches[2] ) ) && ( 3 === count( $matches[1] ) ) ) {
- $query .= " AND ({$matches[1][0]}.meta_key = '{$matches[2][0]}')";
- $prefix = array_slice( $matches[1], 1 );
- $keys = array_slice( $matches[2], 1 );
- } else {
- if ( ( 2 === count( $matches[2] ) ) && ( 2 === count( $matches[1] ) ) ) {
- $prefix = $matches[1];
- $keys = $matches[2];
- } else {
- // Wrong query
- return $pieces;
- }
- }
- foreach ( $keys as $key => $value ) {
- if ( 'event_start_date' === $value ) {
- $start_prefix = $prefix[ $key ];
- }
- if ( 'event_end_date' === $value ) {
- $end_prefix = $prefix[ $key ];
- }
- }
- if ( empty( $start_prefix ) || empty( $end_prefix ) || $start_prefix === $end_prefix ) {
- return $pieces;
- }
- // after start date AND before end date
- $_query = " AND (
- ( $start_prefix.meta_key = 'event_start_date' AND ( CAST($start_prefix.meta_value AS DATE) >= %s) )
- AND ( $end_prefix.meta_key = 'event_end_date' AND ( CAST($end_prefix.meta_value AS DATE) <= %s) )
- )";
- $query .= $wpdb->prepare( $_query, $event_start_date, $event_end_date );
- // OR before start date AND after end end date
- $_query = " OR (
- ( $start_prefix.meta_key = 'event_start_date' AND ( CAST($start_prefix.meta_value AS DATE) <= %s) )
- AND ( $end_prefix.meta_key = 'event_end_date' AND ( CAST($end_prefix.meta_value AS DATE) >= %s) )
- )";
- $query .= $wpdb->prepare( $_query, $event_start_date, $event_end_date );
- // OR before start date AND (before end date AND end date after start date)
- $_query = " OR (
- ( $start_prefix.meta_key = 'event_start_date' AND ( CAST($start_prefix.meta_value AS DATE) <= %s) )
- AND ( $end_prefix.meta_key = 'event_end_date'
- AND ( CAST($end_prefix.meta_value AS DATE) <= %s )
- AND ( CAST($end_prefix.meta_value AS DATE) >= %s )
- )
- )";
- $query .= $wpdb->prepare( $_query, $event_start_date, $event_end_date, $event_start_date );
- // OR after end date AND (after start date AND start date before end date) )
- $_query = "OR (
- ( $end_prefix.meta_key = 'event_end_date' AND ( CAST($end_prefix.meta_value AS DATE) >= %s ) )
- AND ( $start_prefix.meta_key = 'event_start_date'
- AND ( CAST($start_prefix.meta_value AS DATE) >= %s )
- AND ( CAST($start_prefix.meta_value AS DATE) <= %s )
- )
- )";
- $query .= $wpdb->prepare( $_query, $event_end_date, $event_start_date, $event_end_date );
- $pieces['where'] = $query;
- return $pieces;
- }
- function remove_get_meta_sql_filter( $posts ) {
- remove_filter( 'get_meta_sql', 'get_meta_sql_date', 10, 2 );
- return $posts;
- }
- add_action( 'save_post', 'validate_event_meta' );
- // adds event_start_date meta if only event_end_date was submitted.
- function validate_event_meta( $post_id ) {
- if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
- return $post_id;
- }
- if ( !current_user_can( 'edit_post', $post_id ) ) {
- return $post_id;
- }
- $post_type = ( isset( $_POST['post_type'] ) ) ? $_POST['post_type'] : '';
- if ( 'post' !== $post_type ) {
- return $post_id;
- }
- $event_end_date = get_post_meta( $post_id, 'event_end_date', true );
- if ( !empty( $event_end_date ) ) {
- if ( !get_post_meta( $post_id, 'event_start_date', true ) ) {
- update_post_meta( $post_id, 'event_start_date', $event_end_date );
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement