4

I have a channel entries loop where I am pulling data from multiple channels. These entries are then mixed together in the sort order they are returned in. With all but one channel I'd like to restrict it to not show future entries. However, I do need to show future entries for that one remaining channel. What are my options.

1
  • 1
    My guess is you need a custom query for this. Dec 21, 2012 at 5:39

4 Answers 4

2

how about

{exp:channel:entries channel="alpha|beta|gamma"}
    {if channel_short_name == 'blah'}
        show me
    {if:else}
        {if entry_date > current_time}
            show me
        {/if}
    {/if}
{/exp:channel:entries}
1
  • I think you need to filter on the date first because in your example 'blah', which shouldn't show future entries will do, and the other channel will only show future entries, not all of them.
    – Tyssen
    Dec 21, 2012 at 5:08
2

You can only do that kind of conditional retrieval by using a custom SQL query that does some checking of dates for you. Fortunately it's a pretty trivial query - only a little bit of logic required. Without knowing more about what your data looks like, etc, it's hard to provide more details information, but I'd suggest you run something like the (totally untested, probably broken, and and likely to corrupt your DB) SQL below through the Query Module.

SELECT
  exp_channel_titles.entry_id AS id,
  exp_channel_titles.title AS title,
  exp_channel_titles.entry_date AS date_published
FROM
  exp_channel_titles
WHERE 
  ((exp_channels.channel_name = 'no_future_posts_channel_name_1' OR
    exp_channels.channel_name = 'no_future_posts_channel_name_2') AND
    exp_channel_titles.entry_date <= NOW()) OR
    exp_channel_titles.channel_name = 'future_posts_ok_channel_name'
ORDER BY 
  date_published DESC
LIMIT 
  15;
1
  • This is the approach I am going to take. Your query is a good start. Thanks for the help.
    – caseyreid
    Dec 21, 2012 at 22:08
1

You could maybe do this:

{if entry_date > current_time}
   {if channel_short_name == "channel-that-should-show-future-entries"}
      show stuff
   {/if}
{if:else}
   {if (channel_short_name == "channel-that-should-show-future-entries" && entry_date <= current_time) OR channel_short_name!="channel-that-should-show-future-entries"}
      show stuff
   {/if}
{/if}
3
  • This assumes you've got show_future_entries="yes" on your channel entries tag.
    – Tyssen
    Dec 21, 2012 at 5:08
  • Thanks Tyssen. The only issue with that approach I think is that I need to return a set number of entries. If I am showing/hiding entries inside the c:e loop, the count is not going to stay accurate. I think it's going to require a custom SQL query to grab the right entry ids and then feed those into the c:e loop. That is the path I'm heading down, but wanted to make sure I wasn't overlooking something first.
    – caseyreid
    Dec 21, 2012 at 5:15
  • 1
    Ah right, yeah a fixed limit will throw that out. Query module should do it.
    – Tyssen
    Dec 21, 2012 at 5:16
1

I think a custom query in a simple plugin would be the most straightforward approach. However, it may be possible using just a template without a custom query if you:

  1. Ran an entries loop that allowed future entries, ultimately returning more than you needed
  2. Added those entries you wanted (filtered by channel short name and date conditionals) to Stash's set_list tag
  3. Used Stash's get_list tag to display the results, specifying your overall limit there

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.