WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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.