The comment thread starting here describes an effective workaround. MotoTribe linked to the same thread, but at the time of his question, there was no working example on that page. Now there is, as follows:
In your module, implement hook_views_api()
:
function MODULENAME_views_api() {
return array(
'api' => 3,
);
}
Then add a new file to your module called MODULENAME.views.inc, and implement hook_views_query_alter()
:
function MODULENAME_views_query_alter(&$view, &$query) {
if ($view->name == 'whatever_your_view_is_called') {
$query->where[0]['type'] = 'OR';
}
}
Also be aware of this caveat:
Apparently, the "Content: Published (Yes)" filter that comes with every View is considered to be a part of the same filter group as the contextual filters (group 0). So in order to make my view display only published nodes which belong to any of the groups specified by contextual filters (published AND (arg1 OR arg2 OR ...)), I had to move the "Content: Published (Yes)" into a new filter group (using the "And/Or, Rearrange" dialog). Note that the UI didn't display the "Content: Published (Yes)" filter any differently after I moved it into a new group (there weren't any other groups), but in the query object that gets passed into hook_views_query_alter()
it did move it from group 0 into group 1, causing the code in the above functions to no longer affect it.