WordPress wp_query() basic question about args

Your 3rd option is correct.

$args3 = array(
    'posts_per_page' => 9,
    'orderby'        => 'date',
    'order'          => 'DESC',
    // If you're only specifying one. Use array( 'projects', 'post' ); for many.
    'post_type'      => 'projects',
    // This is the correct syntax for a taxonomy query. 
    'tax_query'      => array(
        array(
            'taxonomy' => 'projects_categories',
            'terms'    => $cat_id,
        ),
    ),
);
$getposts->query( $args3 );

The other options you have posted here are old methods that are no longer valid for custom taxonomy queries. Always reference to WP_Query Codex to make sure you’re using the latest parameters.

As for your second question, posts_per_page replaced showposts. showposts is no longer valid.

tech