4

好的,所以在我的主页上,我想拉出 3 个新闻项目列表;重大新闻、专题新闻和新闻头条。一次应该只在主要新闻标题下显示一个项目,任何其他被标记为此类的条目将过滤回特色新闻列表。

我的问题是捕获“一个”主要新闻项目的 entry_id 并将其从特色列表中排除。主要新闻项目可能并不总是最新的新闻项目,因此排除使用 offset="1"。

因此,我整理了一些基于自定义字段 (cf_news_article_type) 过滤掉新闻的 Stash 集。cf_news_article_type 是用户在添加新闻项目时设置的 3 个单选按钮的列表。字段的值设置如下:

mj : Major Feature
gf : Featured Article
gn : General article

我存储了一组 13 条来自所有类型的新闻:

{!-- Bring out all the recent news --}
{exp:channel:entries channel="news" orderby="date" sort="desc" dynamic="no" limit="13" parse="inward" disable="categories|category_fields|member_data|pagination|trackbacks"}
{exp:stash:append_list name='recent_articles'}
    {stash:item_count}{count}{/stash:item_count}
    {stash:item_type}{cf_news_article_type}{/stash:item_type}
    {stash:item_title}{title}{/stash:item_title}
{/exp:stash:append_list}
{/exp:channel:entries}

然后稍后在我的模板中,我提取了主要新闻项目:

<article class="major-feature">
{exp:stash:get_list name="recent_articles" match="#mj#" against="item_type" limit="1" parse_tags="yes"}
    {sn_news_story}
{/exp:stash:get_list}
</article>

现在的大问题是:我如何才能从精选新闻列表中排除该单一主要新闻项目,但在获得精选隐藏列表时将其他项目标记为“mj”?

<section class="featured-stories">
<h1>Featured stories</h1>
{exp:stash:get_list name="recent_articles" match="#(mj|gf)#" against="item_type" limit="3" parse_tags="yes"}
    {sn_news_story}
{/exp:stash:get_list}
</section>

然后对于我的头条新闻,我很想排除这两个列表中显示的所有特色和主要新闻项目,但我认为我会在另一篇文章中解决这个问题。

这甚至是做这种事情的正确方法吗?任何帮助将不胜感激。

4

1 回答 1

1

单独存放您的精选新闻文章怎么样?例如:

{!-- find just the featured article --}
{exp:channel:entries channel="news" orderby="date" sort="desc" dynamic="no" search:cf_news_article_type="mj" limit="1" parse="inward"}
    {exp:stash:append_list name='featured_article'}
        {stash:item_count}{count}{/stash:item_count}
        {stash:item_type}{cf_news_article_type}{/stash:item_type}
        {stash:item_title}{title}{/stash:item_title}
    {/exp:stash:append_list}
    {exp:stash:set_value name="featured_article_id" value="{entry_id}" type="snippet"}
{/exp:channel:entries}

然后,当您找到其余新闻时,只需忽略您已经隐藏的特色文章:

{!-- find the rest of the news --}
{exp:channel:entries channel="news" orderby="date" sort="desc" dynamic="no" limit="12" entry_id="not {featured_article_id}" parse="inward"}
    {exp:stash:append_list name='recent_articles'}
        {stash:item_count}{count}{/stash:item_count}
        {stash:item_type}{cf_news_article_type}{/stash:item_type}
        {stash:item_title}{title}{/stash:item_title}
    {/exp:stash:append_list}
{/exp:channel:entries}

(我不确定您是否会遇到解析顺序问题{featured_article_id},但如果是这样,应该有办法解决)

或者,如果您不介意所有精选新闻文章都在列表顶部,您可以使用orderby="cf_news_article_type|date", 然后使用limit=""andoffset=""将第一篇新闻文章从列表中删除。

更新:您也可以反过来执行此操作,并在检索列表时检查 entry_id:

<article class="major-feature">
    {exp:stash:get_list name="recent_articles" match="#mj#" against="item_type" limit="1" parse_tags="yes"}
        {exp:stash:set_value name="featured_article_id" value="{entry_id}" type="snippet"}
        {sn_news_story}
    {/exp:stash:get_list}
</article> 

<section class="featured-stories">
    <h1>Featured stories</h1>
    {exp:stash:get_list name="recent_articles" match="#(mj|gf)#" against="item_type" limit="3" parse_tags="yes"}
        {if "{entry_id}" != "{featured_article_id}"}
            {sn_news_story}
        {/if}
    {/exp:stash:get_list}
</section>
于 2012-10-31T22:21:30.087 回答