After detailed debugging of WP::parse_request() and WP_Query::parse_query() I found out that unset( $query_vars['date'] ); in 'request' filter helps.
It basically unsets date query var before WP_Query::parse_query() is invoked so is_home() returns false.
add_filter( 'request', function( $query_vars ) {
global $wp_query, $wp;
if ( ! $wp_query->is_main_query() ) {
return $query_vars;
}
$qv_keys = array_keys( $wp->query_vars );
if ( ! ( in_array( 'product_cat', $qv_keys, true )
|| in_array( 'product_tag', $qv_keys, true )
|| in_array( 'post_type', $qv_keys, true ) && 'product' === $wp->query_vars['post_type']
|| in_array( 's', $qv_keys, true )
) ) {
unset( $query_vars['date'] );
}
return $query_vars;
} );
Explanation:
Posts archive loads when WP_Query::$is_home = true so I traced back places where this value is set and in brief I think it’s like this:
$this->query_vars['post_type']and$this->query_vars['name']are not set in this condition as date query var is not assigned with any post type.- In result after many operations
WP_Query::$is_singularis set to false here - And it leads to
WP_Query::$is_home = true.