Views - How to exclude nodes marked for menu display
Using hook_views_query_alter() to filter out nodes that appear in a menu from a Views listing.
function mymodule_views_query_alter($view, $query) {
if ($view->id() === 'page_listing' && $view->current_display === 'block_1') {
$join = Views::pluginManager('join')->createInstance('standard', [
'type' => 'LEFT', 'table' => 'menu_link_content_data',
'field' => 'link__uri', 'left_table' => 'node_field_data', 'left_field' => 'nid',
'left_formula' => "CONCAT('entity:node/', node_field_data.nid)",
]);
$query->addRelationship('mlc', $join, 'node_field_data');
$query->addWhereExpression(0, 'mlc.link__uri IS NULL');
}
}