Posted on

Excluding old content from the search

Is there a way to exclude anything before 2016 from search results?

Yes. There are two approaches to this. If you never want to see anything old in the results, it’s best to filter in indexing with relevanssi_indexing_restriction. Add this to your site:

add_filter( 'relevanssi_indexing_restriction', 'rlv_exclude_old_posts' );
function rlv_exclude_old_posts( $restriction ) {
	global $wpdb;
	$restriction['mysql']  .= " AND YEAR(post.post_date) >= 2016 ";
	$restriction['reason'] .= ' Post too old';
	return $restriction;
}

Note that the restriction explains which posts are included in the index, so that’s why the year is >= 2016 and not < 2016.

To deindex posts from the news post type that are older than one year, you can use:

add_filter( 'relevanssi_indexing_restriction', 'rlv_exclude_old_news' );
function rlv_exclude_old_news( $restriction ) {
    $restriction['mysql']  .= ' AND ( ( post.post_date >= CURDATE() - INTERVAL 1 YEAR '
      . " AND post.post_type = 'news' ) OR ( post.post_type != 'news' ) ) ";
    $restriction['reason'] .= ' News post too old';
    return $restriction;
}

If, on the other hand, you only want to apply this filter in searching, you can use the WP_Query date parameters like this:

add_filter( 'relevanssi_modify_wp_query', 'rlv_date_filter' );

/**
 * Adds a date filter to the search query.
 *
 * @param WP_Query $query The query object.
 *
 * @return WP_Query The modified query object.
 */
function rlv_date_filter( $query ) {
    $date_query = array(
        'after'     => 'January 1st, 2016',
        'inclusive' => true,
    );
    $query->set( 'date_query', $date_query );
    return $query;
}

Leave a Reply

Are you a Relevanssi Premium customer looking for support? Please use the Premium support form.

Your email address will not be published. Required fields are marked *