Multiple Views on a page - How to exclude already shown nodes? I'm showing many nodes on a page using a few different Views blocks with Panels. 

For example there is a "Top Story" block that shows the latest sticky article. Then there are blocks for certain Sections (taxonomy) and important Special Sections (another taxonomy). 

A node can appear in both blocks if it has a Section (say, Culture), a Special Section (News) and it may also be Sticky (so it's up in the Top story block too).

The problem here is that I can't just utilize offsets to hide things, but would need something that excludes nodes from later views that have already been shown. Older sticky nodes naturally should push down to their respected blocks when newer Nodes come etc.

Another way to put it:

Let's say we have Views, A, B, C and D. If a node is already in A, it wouldn't show up in B, C and D. If it's shown in B, it would not show up in C &amp; D. It should be hierarchical from "promotion" style blocks to more simple listings when going lower on the page.

Is there any ready solution that would help me achieve this? I'm familiar with module coding, hooks etc so that sort of solutions are open to me as well.
You could load and display each view in your template. 
For each view you will have to get a list of nid values that you then will pass on as argument to the next view in line. 

For this to work you should setup a Contextual Filter of type Content: nid and configure it to allow multiple values and exclude supplied nids.



In your template your could then do something like this:

// load and display view A
$viewA = views_get_view('VIEW_A');
$viewA-&gt;execute();
// get all nids from the result 
foreach ($viewA-&gt;result as $result):
   $nids[] = $result-&gt;nid;
endforeach;
// render first view
print $viewA-&gt;render();

// now load view B
$viewB = views_get_view('VIEW_B');
// set arguments for view
$viewB-&gt;set_arguments(array(implode(",", $nids)));
// execute view
$viewB-&gt;execute();
// render
print $viewB-&gt;render();


If you would like to use just one view with multiple displays, you could use set_display() to select the display that should be used:

$view = views_get_view('VIEW');
$view-&gt;set_display('VIEW_DISPLAY_ID');
$view-&gt;execute();