简体   繁体   中英

For Loop Using Umbraco TagQuery with Multiple Tags to Get Related Nodes/Items

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.

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>
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM