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.
4 Answers
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}
-
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.– TyssenDec 21, 2012 at 5:08
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;
-
This is the approach I am going to take. Your query is a good start. Thanks for the help. Dec 21, 2012 at 22:08
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}
-
This assumes you've got show_future_entries="yes" on your channel entries tag.– TyssenDec 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. Dec 21, 2012 at 5:15
-
1Ah right, yeah a fixed limit will throw that out. Query module should do it.– TyssenDec 21, 2012 at 5:16
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:
- Ran an entries loop that allowed future entries, ultimately returning more than you needed
- Added those entries you wanted (filtered by channel short name and date conditionals) to Stash's set_list tag
- Used Stash's get_list tag to display the results, specifying your overall limit there