We will likely introduce better native support for pagination at some point, but for now, this is an okay workaround that only requires a little code.
This will change ?page=2
pagination URLs to /page/2
URLs, so the SSG is able to recognize them as their own pages.
Copy UrlPaginator
into app/UrlPaginator.php
.
You can put it somewhere else, but be sure to update the namespace in the class itself, and any references to it.
This class overrides Statamic's paginator and changes the /url?page=2
urls to /url/page/2
urls.
Copy the contents of the boot
method into your own AppServiceProvider
.
In here it will:
- Swap out Statamic's paginator for the url based one
- Tell the paginator to look at the
/page/{page}
part of the url for the page number, rather than looking for a?page=
query string. - Add any paginator urls to the SSG's "urls" config.
Since this method of pagination means there will be separate pages, you'll need a route.
You can copy the route in web.php
and tweak as necessary. Make sure to keep page/{page}
in there.
Rinse and repeat for any other sections of your site that have pagination.
In the service provider, you'll see this block:
$config['urls'] = array_merge(
$config['urls'],
$this->articleUrls(),
// $this->blogUrls(),
// $this->tagUrls(),
// etc
);
This is going to dynamically add URLs to the ssg.php
config file.
- Copy over the
articleUrls
method. - Tweak the naming for what makes sense for you.
- Adjust the URL, query, and perPage in order to correspond to your collection tag.
- Repeat for any other sections of your site that have pagination.
Having problems to get this to work.
What I did.
web.php
. I haveRoute::statamic('news/page/{page}', 'news/index', ['load' => 'b9e4bfe3-9c12-4553-b7ef-f43c22ffaa63']);
where the id is from the News page that lists the paginated news articles.I have a collection
news
, with articles in there. The news index template is in/view/news/index.antlers.html
When I generate the site with
ssg:generate
, the index.html in /news has the 'old' ?page=2 urls.Do you have an idea what is going wrong here @jasonvarga?
Update:
FIXED!
I upgrade to version 4.6.0
Reapplied the changes mentioned in this gist, and it works!