Search code examples
laraveloctobercmsoctobercms-backend

How can I sort the featured blog posts in the top of the list in Octobercms


My request is simple. I want to keep my blog list ordered by created_at DESC but I want also to show the featured posts in top.

Let's say that I have 4 categories : Gold, Silver, Bronze and Other ...

I want to display the Gold posts first.

Then the Silver posts.

Followed by the Bronze posts.

And finally the others.

All of them should be ordered by created_at DESC.

  1. Is there a feature out of the box to do that ?
  2. Or should I create a new plugin to extend Blog with this feature ?

What do you think ?


Solution

  • I am assuming you are using the Rainlab Blog plugin. There are numerous ways to solve this and I don't think there is an official "way". Here are some examples that you will have to fit for your own code.

    1. Solution with Twig. Twig has a sort filter which you can pass in an arrow function, check here. Then you can do if statements to display gold to bronze.

      {% for blog in blogs|sort((a, b) => a.created_at <=> b.created_at) %}
      {% if blog.category == Gold %}{{ blog }}{% endif %}
      {% endfor %}
      
    2. Adhoc CMS Page. Instead of using the rain blag component you can use the plugin in the PHP Code to the page/layout/partial. This is where give you the ability to work with the model to organize it the way you want to. Here I am using OctoberCMS querying features.

      use Rainlab\Blog\Models\Post;
      
      public function onStart() {
          $this['golds'] = Post::whereHas('categories', function ($query) {
              $query->where('name', 'Gold');
          })->get()->sortBy('create_at');
      }
      
    3. Third way and the way I recommend is to build your own plugin which can either extend or filter the blogs posts like how I did in the CMS Page example. Read the documentation here.

    One side note that if you click into the {% component 'something' %} you can expand the htm template.

    enter image description here