我正在使用 Umbraco 13,并希望提供“最新文章”功能。
我一直在我的文档类型上使用“发布开始日期”和“发布结束日期”的内容项,我用它来控制可见性,并且我可以用它来根据发布开始日期提取最近的 x 篇文章。
我们的用户现在已经发现,现在更喜欢使用内置的“发布时间”和“取消发布时间”日期来安排其页面的显示,这意味着我必须在这些字段上加倍(并希望用户为我的自定义字段和 umbraco 字段选择相同的日期),防止用户使用标准 umbraco 调度功能来支持我的自定义功能,或者查找并使用“发布于”和“取消发布于”日期替换我的自定义字段。
将字段加倍是自找麻烦 - 我已经看到了我的字段和“发布日期”使用不同日期的情况,如果我诚实的话,从支持的角度来看,我宁愿让他们尽可能使用核心 Umbraco 的东西而不是定制的东西。
考虑到这一点,有谁知道我如何阅读给定祖先页面的后代页面的“发布于”和“取消发布于”日期?
我现有的代码如下所示:
var articles = page.Descendants("Article")
.Where(t => t.Value<DateTime>("publishStartDate") <= DateTime.Now.Date &&
t.Value<DateTime>("publishEndDate") >= DateTime.Now.Date &&
t.IsPublished() &&
t.IsVisible())
.OrderByDescending(t => t.Value<bool>("featured"))
.ThenByDescending(t => t.Value<DateTime>("publishStartDate"))
.Take(4)
.ToList();
如果我只是使用 Umbraco 功能,我可以删除对当前日期在publishStartDate 和publishEndDate 之间的检查,因为这将由IsPublished() 和IsVisible() 扩展覆盖。 我遇到的问题是按publishStartDate排序,因为我找不到替换它的日期,这样我就可以取前4篇文章。
由于publishStartDate和publishEndDate检查可以被Umbraco的调度取代,因此您可以使用ContentService来获取每篇文章的内部“发布于”日期,然后按该日期排序。
@using Umbraco.Cms.Core.Services
@inject IContentService contentService
var articles = page.Descendants("Article")
.Where(t => t.IsPublished() && t.IsVisible())
.Select(t => new
{
Content = t,
PublishAt = contentService.GetById(t.Id)
?.ContentSchedule?.FirstOrDefault(s => s.Culture == null)?.Date
})
.Where(x => x.PublishAt != null)
.OrderByDescending(x => x.Content.Value<bool>("featured"))
.ThenByDescending(x => x.PublishAt)
.Select(x => x.Content)
.Take(4)
.ToList();