Exclude Current Node from List of Related Nodes by Taxonomy Term
You know the scenario - you want to list nodes that have the same taxonomy term(s) as the node you are currently viewing. Easy, but you also want to exclude the currently-being-viewed node from the list. Always trips me up.
Each time I have to do this, I read a blog or two or a Drupal issue or two and still I always end up with a quirk. Here's what I normally do:
- Create the view
- Add a contextual filter for the taxonomy field you want to filter by
- Provide default value
- Taxonomy term ID from URL
- Load default filter from node page, that's good for related taxonomy blocks
- Limit terms by vocabulary
- Click Apply
Now I'm Stuck
This gives you a list of nodes related to the current one, but the current node will always show up in your list. If you edit that contextual filter and expand the 'More' tab at the end, and then choose 'Exclude: If selected, the numbers entered for the filter will be excluded rather than limiting the view.' you will be forgiven for thinking this will exclude the current node. IT WON'T. In this case, it will exclude the currently selected taxonomy term - which is the opposite of what you want to do.
The Solution? Another Contextual Filter
- Create another contextual filter for 'ID', as in, the Node ID.
- Provide default value
- Content ID from URL
- Scroll to bottom of page and expand the 'More' tab
- Click Exclude: If selected, the numbers entered for the filter will be excluded rather than limiting the view.
Now, the second filter will exclude the currently-being-viewed node, while the first filter will do the related-node-taxonomy-magic-dance.
Exactly what I needed, thanks a lot mate
If after doing the above you are still seeing the current node add another contextual filter for node revisions similar to the Node ID above.
Thanks a lot, Frederick. I hadn't thought of that part.
Thanks for this write-up. I've used variants of this approach in Drupal 6 and 7, but I have a real headscratcher on my first Drupal 8 site:
-View is designed to show other works by the same author as the current work (ID from URL.) The author is a reference field on the work content type.
-I create a contextual filter pulling the current work's ID from the URL.
-I use two relationships to generate the list of all works:
No problem so far—I can generate a full list of all works by the same offer. BUT I can't exclude the current work.
-If I create a second contextual filter with the "exclude" option on the current node's ID, even if it uses that second relationship, it causes a validation error and the view gives no results.
I am used to being able to make this work using Drupal 6 and Drupal 7 Panels, which allow you specify which input goes to which argument in the View, but the streamlined Drupal 8 approach seems to have left me in a Catch 22 here.
I'm sorry, but I haven't tried to set up something like you are trying here. If I get time to test it, I'll post my findings back here.