How to filter a view by content that references the current node in modern Drupal
References and contextual filters
It is often enough throughout the journey of building websites that you will desire to create very specific lists of content. In my current endeavor, I am working in Drupal 9 with 2 content types: Office location and Event . Each Event occurs at an Office location, which is indicated by an Office location entity reference field on the Event. Note that any info in this blog will also be relevant to Drupal 8, Drupal 10, and beyond.
Here is the user story that we will be working through:
As a site visitor, when I view an Office location node, I should see a list of Events that are occurring at the location represented by the current node, so that I have an easy way to learn about events at locations relevant to me.
To keep this short and sweet, I am going to assume that you have already created a view. However, all views are not created equal, so if you are not seeing the options that you are looking for while editing your view, maybe try creating a new one. We will be working with a block
display—other options are possible, but this is the standard "Drupal approach".
Once you are editing a block display for your view, open the Advanced dropdown
on the right side. Here is what you will see:
Steps
1, Add a relationship to content referenced by your entity reference field
Go ahead and click the Add
button next to Relationships
.
In my case I am looking for Content referenced from field_office_location
. This is the entity reference field on my Event
content type, and is the field that my view will use for comparison while querying data.
Click add and configure relationships
and then Apply
on the next screen.
2. Filter your view results by content that references the current node id
Click the Add
button next to Contextual Filters
Select ID
and click Add and configure contextual filters
.
The red boxes above indicate what needs to be done. Be sure to select the relationship you added to the Relationship
field. This will allow the contextual filter to use the value of the Event's entity reference field for comparison.
Click Provide default value
and select Content ID from URL
in the dropdown that appears. Note that if your nodes have URL aliases that do not include the content ID, Drupal will still provide the content ID to your contextual filter. Now your view will know which content to display by comparing the current node ID with the the values in the entity reference field of each listing.
Lastly, Click Apply
and do not forget to save your view.
The End
Congratulations! Now we know how to filter our view by content that references the current node. You probably still need to place your block and configure which nodes it should or should not display on, but I think that is a "How to" for another day. Have fun Drupaling!
Comments
2024 February 29
Kenny Roa
Hi, What about if we want to…
Hi, What about if we want to get result with views page with path like /location/%/events.. For example for Seattle office events path like /location/seattle/events. And Seattle event well be seen at this path. Content id or field_office_location didn't work at contextual filter . Thanks
2024 March 26
Rachel
Thank you so much! I've been…
Thank you so much! I've been trying to figure out how to do this for a while. Your instructions were easy to understand & my new view worked perfectly!
Add new comment