Archiving posts in wordpress

You can do that with two ways.

1. You can modify the WordPress main query to force WordPress to show posts older than 30 days on archive pages and on blog page, show posts before 30 days. You can limit posts with the help of date_query.

Paste this function in your functions.php file. This should work. I have tested it briefly.

function my_custom_get_posts( $query ) {

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

        if ( $query->is_archive ) {
            $date_query = array(
                array(
                    'column'  =>  'post_date_gmt',
                    'before'   =>  '30 days ago',
                ),
            );
        } else {
            $date_query = array(
                array(
                    'column'  =>  'post_date_gmt',
                    'after'   =>  '30 days ago',
                ),
            );
        }

        $query->set( 'date_query', $date_query );

    }

}
add_action( 'pre_get_posts', 'my_custom_get_posts', 1 );

Please note that this method modifies main WordPress query but you will get desired effect. The only downside will be that this function will change query you have on your website. If you have simple blog then it should not be a problem and you can use it without any issue. Although test it before applying on live website.

2. Use 2 custom page templates to run custom WP_Query for each. Recommended way.

You can apply same date_query limits in each section of website. Create two page templates for each, homepage and archive page.

For homepage you can run custom WP_Query like this.

$args = array(
    'post_type' => 'post',
    'date_query' => array(
        array(
            'column'  => 'post_date_gmt',
            'after'   => '30 days ago'
        ),
    ),
    'paged' => $paged,
);

$homepage_query = new WP_Query( $args );

And for archive page you can define another WP_Query like this.

$args = array(
    'post_type' => 'post',
    'date_query' => array(
        array(
            'column'  => 'post_date_gmt',
            'before'   => '30 days ago'
        ),
    ),
    'paged' => $paged,
);

$archive_query = new WP_Query( $args );

This is better way because it will not make any modification on other WordPress queries.