Reputation: 125
I'm trying to get all items of a certain document type, that are tagged the same as one of the tags on the current node/item.
I can get all related items of one tag by explicitly declaring it via:
var taggedContent = Umbraco.TagQuery.GetContentByTag("Tag1");
var taggedItems = taggedContent.Where(c => c.IsDocumentType("SpecificPageType", true) && c.IsVisible());
But, as GetContentByTag
only takes one argument, I'm not sure how to structure the foreach loop to use my list of tags.
I'd like to make a foreach loop that results in one list of related items that combines all related items from each tag, so that I can then order it with .OrderBy("Id descending")
.
Here's my current static code that works:
var tags = Umbraco.TagQuery.GetTagsForEntity(Node.getCurrentNodeId()).DistinctBy(t => t.Text).OrderBy(t => t.Text);
var taggedContent = Umbraco.TagQuery.GetContentByTag("Tag1");
var taggedItems = taggedContent.Where(c => c.IsDocumentType("SpecificPageType", true) && c.IsVisible());
foreach (var relatedItem in taggedItems)
{
<a href="@relatedItem.Url">
@{
var pageTitle = relatedItem.GetPropertyValue("pageTitle").ToString();
}
<h6>@Umbraco.Truncate(pageTitle, 80, true)</h6>
</a>
}
My failed attempts to construct the loop:
var tags = Umbraco.TagQuery.GetTagsForEntity(Node.getCurrentNodeId()).DistinctBy(t => t.Text).OrderBy(t => t.Text);
var listIWant = new List<IPublishedContent>();
foreach (var tag in tags)
{
var taggedContent = Umbraco.TagQuery.GetContentByTag(tag.ToString());
var taggedItems = taggedContent.Where(c => c.IsDocumentType("SpecificPageType", true) && c.IsVisible());
//How to modify the list here?
}
//OR
var tagsCount = tags.Count();
for (var i = 0; i < tagsCount; i++)
{
var taggedContent = Umbraco.TagQuery.GetContentByTag(tag.ToString());
var taggedItems = taggedContent.Where(c => c.IsDocumentType("SpecificPageType", true) && c.IsVisible());
//How to modify the list here?
}
// Modified the list to contain everything in the loop above, now order it
var orderedList = listIWant.OrderBy("Id descending");
// Create links from ordered list
foreach (var relatedItem in orderedList)
{
<a href="@relatedItem.Url">
@{
var pageTitle = relatedItem.GetPropertyValue("pageTitle").ToString();
}
<h6>@Umbraco.Truncate(pageTitle, 80, true)</h6>
</a>
}
Thank you for any help and let me know if I'm unclear or need further information.
Upvotes: 0
Views: 1095
Reputation: 125
I was able to correctly construct the foreach loop to create the list, then process the list to remove duplicates and order as I wanted. Hopefully this helps someone else. Doubt it's the most efficient way to do it, but it works.
Code:
// Get tags of current item I'm on
var tags = Umbraco.TagQuery.GetTagsForEntity(Node.getCurrentNodeId()).DistinctBy(t => t.Text).OrderBy(t => t.Text);
// Create blank list to add to in foreach loop
var combinedList = new List<IPublishedContent>();
// Get related content by tag for each tag, add to the list
foreach (var tag in tags)
{
var tagString = tag.Text;
var taggedContent = Umbraco.TagQuery.GetContentByTag(tagString);
combinedList.AddRange(taggedContent);
}
// Filter list to only idea items, order by latest, then remove duplicates
var taggedItems = combinedList.Where(c => c.IsDocumentType("NewsPage", true) && c.IsVisible() && c.Id != CurrentPage.Id).OrderBy("Id descending").DistinctBy(x => x.Id).Take(8);
if (taggedItems.Any())
{
foreach (var relatedItem in taggedItems)
{
<a href="@relatedItem.Url">
@{
var pageTitle = relatedItem.GetPropertyValue("pageTitle").ToString();
}
<h6>@Umbraco.Truncate(pageTitle, 80, true)</h6>
</a>
}
Upvotes: 1