結論。よく分からないときは素直に文字列渡しで。仮にフィルターの適用が不要なことが明白な場合には配列が良いと思います。

get_posts などのWordPressコアで提供されている関数のいくつかは、検索条件のパラメータについて文字列、配列、オブジェクトのいずれでも受付可能な柔軟性を持っています。そこで、これはどの形式でも結果やパフォーマンスは同じなのかという話。

この引数は、ひとまず wp_parse_args に渡されてそこで扱いやすい形に整えてから処理に用いられます。内部では次のように、オブジェクト、配列、文字列それぞれに応じた処理がなされています。

function wp_parse_args( $args, $defaults = '' ) {
	if ( is_object( $args ) )
		$r = get_object_vars( $args );
	elseif ( is_array( $args ) )
		$r =& $args;
	else
		wp_parse_str( $args, $r );

	if ( is_array( $defaults ) )
		return array_merge( $defaults, $r );
	return $r;
}

一目瞭然ですが、配列で渡すことが最も負荷が少なくてすみます。では必ず配列にするべきかというと、 wp_parse_args の内部で文字列の場合にコールされている wp_parse_str には “wp_parse_str” というフックに引っかかってるフィルターの処理が施されます。

function wp_parse_str( $string, &$array ) {
	parse_str( $string, $array );
	if ( get_magic_quotes_gpc() )
		$array = stripslashes_deep( $array );
	$array = apply_filters( 'wp_parse_str', $array );
}

つまり、フィルターの適用が必要な場合は文字列で渡さなくてはなりません。フィルターで引数を操作できる機能は、URLのGETクエリを扱う場合などは威力を発揮するでしょう。また、何らかの検索用プラグインを導入している場合もフィルターを通す必要があるかもしれません。

とはいえ、自分で関数なりメソッドなりを作成してそこから呼び出す際にはフィルターのお世話にならずとも何とでもなりますので、そのような場合にはやはり配列で渡すほうが良いのではないかと思います。また、そのほうが引数の管理も容易なので私はなるべく配列で渡すようにしています(←管理の容易さのほうが個人的には重要だったり)。

文字列で渡すやり方は、URLのクエリに埋め込んでGETで結果を得る場合にのみ用いるべきというのが現時点の私見です。