Umbraco 13:如何读取内置发布日期实现最新文章排序筛选
Umbraco 13 改用内置发布/取消发布日期实现「最新文章」功能
问题背景
此前通过自定义字段publishStartDate和publishEndDate控制文章可见性并排序,现需替换为Umbraco内置的「Publish At」和「Unpublish At」调度日期,避免字段重复,同时更新查询与排序逻辑。
修改后的代码实现
using Umbraco.Cms.Core.Models.ContentEditing; var articles = page.Descendants("Article") .Where(t => t.IsPublished() && t.IsVisible() && // 校验内置Publish At:未设置则直接通过,已设置需早于等于当前日期 (t.ContentSchedule.Items.FirstOrDefault(x => x.Action == ContentScheduleAction.Publish)?.Date ?? DateTime.MinValue) <= DateTime.Now.Date && // 校验内置Unpublish At:未设置则直接通过,已设置需晚于等于当前日期 (t.ContentSchedule.Items.FirstOrDefault(x => x.Action == ContentScheduleAction.Unpublish)?.Date ?? DateTime.MaxValue) >= DateTime.Now.Date) .OrderByDescending(t => t.Value<bool>("featured")) .ThenByDescending(t => // 排序优先用计划发布日期,未设置则回退到实际发布日期 t.ContentSchedule.Items.FirstOrDefault(x => x.Action == ContentScheduleAction.Publish)?.Date ?? t.PublishDate) .Take(4) .ToList();
关键逻辑说明
- 读取内置调度日期:通过
ContentSchedule.Items获取内容的计划任务,筛选ContentScheduleAction.Publish(对应「Publish At」)和ContentScheduleAction.Unpublish(对应「Unpublish At」)的条目,提取日期值。 - 空值兼容处理:若未设置调度日期,用
DateTime.MinValue(发布条件)和DateTime.MaxValue(取消发布条件)确保逻辑兼容「立即发布」「永久发布」的原有场景。 - 排序规则替换:排序时优先使用计划发布日期,若未设置则回退到内容的实际发布日期
t.PublishDate,保持原有的「置顶优先、最新优先」排序逻辑。 - 保留原有校验:继续使用
IsPublished()和IsVisible()确保只获取已发布且前端可见的内容。
内容的提问来源于stack exchange,提问作者Chris Disley
相关产品推荐
相关产品推荐

