Showing all posts from different folders (merging collections)

I make posts in two folders, call them /a/ and /b/.

Is it possible on the index page to display all the posts from both of those folders, sorted by date?

If all posts have the same template you could use this:

$posts = $site->index()->filterBy('template', 'YOURTEMPLATE')

Otherwise you could merge two collections like this:

  $posts_a = $site->find('a')->children();
  $posts_b = $site->find('b')->children();
  $posts = new Pages(array($posts_a, $posts_b));

Found here: Merge Collection of Pages

1 Like

I’d go for the second option @flokosiol suggested, and to sort by date:

$posts = $posts->sortBy('date', 'desc'); //or asc, depending on what you want to achieve.

Oh yes, of course. I missed that … :wink:

Hey thanks @flokosiol and @texnixe, this looks perfect. :grinning:

I’m a little confused on the actual implementation of the code, do I somehow include it with a foreach statement like how I would on the individual pages?

You loop through the posts collection after merging:

  $posts_a = $site->find('a')->children();   
  $posts_b = $site->find('b')->children();   
  $posts = new Pages(array($posts_a, $posts_b))->sortBy('date', 'desc'); ?>
 foreach($posts as $post) : ?>
  //do stuff
<?php endforeach ?>

I can’t seem to get the first part to work, the page just goes blank. In my case the two folders I put my posts in are called “buy” and “bought” ie (/content/buy/11223333-post/post.txt).

        <?php snippet('header') ?>
    <ul class="grid">
    	  $posts_a = $site->find('bought')->children();
    	  $posts_b = $site->find('buy')->children();
    	  $posts = new Pages(array($posts_a, $posts_b))->sortBy('date', 'desc'); ?>

<?php foreach($posts as $post) : ?>
        post stuff...
<?php endforeach ?>


 <?php snippet('footer') ?>

Have you turned on debugging in your config.php? What is the error?

One idea is that you can’t just use the string syntax “sortBy” like above, try putting it on a different line or put the new Pages thingy in parenthesis before adding sortBy().

$posts = new Pages(array($posts_a, $posts_b)); 
$posts = $posts->sortBy('date', 'desc');
1 Like

Aha that was it! They had to be on separate lines. :stuck_out_tongue_winking_eye:

Thanks again for the help, I’ve been struggling the last couple days to find out how to merge collections in these flat-files CMSes, StaceyCMS had me pulling my hair out yesterday but Kirby looks perfect!

Yeah, Kirby is great, and just on a side note, Stacey does not seem to be under active development anymore. The last commit on Github was 2 years ago and the same is true for quite a few other flat-file CMS.

Oh for sure I have Kirby running for two other projects, love it.

But this is a super-super-side project so I was looking to avoid the 15€ and because I’ve used Stacey before, but to be honest, it’s totally worth it every time.

Nevermind. This was just me forgetting about looking out for captial letters in folder names…
Been too long since I worked with Kirby. Now it works perfectly!