Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I'm modifying the query for archives pages so that the posts showing up on year, month or day pages are queried by there custom field (start-date and end-date) and are sorted by custom star-date field. Here's my code:

function display_posts_on_archive_pages( $query ) {
    if( $query->is_main_query() && $query->is_archive && !is_admin() ) {

        $year = $query->query['year'];
        $month = isset($query->query['monthnum']) ? $query->query['monthnum'] : NULL;
        $day = isset($query->query['day']) ? $query->query['day'] : NULL;

        if($query->is_year){
            $value = array(mktime(0, 0, 0, 01, 01, $year), mktime(23, 59, 59, 12, 31, $year));
            $compare = 'BETWEEN';

        } else if($query->is_month){
            $next_month = sprintf("%02d",$month+1);
            $value = array(mktime(0, 0, 0, $month, 01, $year), mktime(0, 0, 0, $next_month, 01, $year));
            $compare = 'BETWEEN';

        } else if($query->is_day){
            $value = mktime(0, 0, 0, $month, $day, $year);
            $compare = '<=';
            $compare2 = '>=';
        }

        $meta_query[] =
            array(
               'key' => 'if_events_startdate',
               'value' => $value,
               'compare' => $compare,
              );

        if($query->is_month){
            $meta_query[] =
                array(
                   'key' => 'if_events_enddate',
                   'value' => $value,
                   'compare' => $compare,
                  );
            $meta_query['relation'] = 'OR';
        }

        if($query->is_day){
            $meta_query[] =
                array(
                   'key' => 'if_events_enddate',
                   'value' => $value,
                   'compare' => $compare2
                  );
            $meta_query['relation'] = 'AND';
        }

        $query->set( 'year','' );
        $query->set( 'monthnum', '' );
        $query->set( 'day','' );
    if(!$query->is_month){
        $query->set( 'meta_key', 'if_events_startdate' );
        $query->set( 'orderby', 'meta_value_num' );
        $query->set( 'order', 'ASC' );
    }
        $query->set( 'posts_per_page', '10' );  
        $query->set( 'meta_query', $meta_query );
    }
}
add_action( 'pre_get_posts', 'display_posts_on_archive_pages' );

For Year and Day pages everything is OK, but for Month pages the sorting won't work (that's why I've put the if ( ! $query->is_month ) { in the $query->set. At the end for month pages I have the right posts but without the start-date sorting. And if I delete the if ( ! $query->is_month ) { statement I get posts even if they are not included in the month queried (ex.: posts of September in August...)

If anyone has a clue... didn't find my solution for the moment. Thanks

share|improve this question

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Browse other questions tagged or ask your own question.