For the longest time whenever I needed to customise the WordPress loop my go to would be to use the WP_query function, but then I learned of a better and more performant method using WordPress’s pre_get_posts() function which allows us to modify the main query, rather than creating an entirely new one.

Unless I need to output multiple loops on a page, modifying the query using the pre_get_posts() is now the function I reach for.

// Modifies the Default loop query for posts to return a random order
function override_posts_query( $query ) {

    if ( is_post_type_archive( 'posts' ) && $query->is_main_query() ) {
        $query->set( 'orderby', 'rand' );
        $query->set( 'order', 'DSC' );
        $query->set( 'posts_per_page', 12 );
        // these are just examples of how you might modify a query. 
        //Update these as needed to fit what you're trying to do.
add_filter( 'pre_get_posts', 'override_posts_query' );