All pages

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');
  }
}