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.
I've been fighting with the index pages being generated as a random page. Like go to /blog, and it might actually be showing you page 3, 4, 5, or even page 8 when you only have 6 pages. I'm not filing this as an official issue, because I think it might be something related to this instead of the SSG itself, but I could be wrong.
Anyway, I found a workaround that barely seems to make any sense.
I added the routes to web.php that were needed according to these instructions. In my case it looks like this, because I paginated several sections:
After trying various unsuccessful workarounds, I came up with one that appears to work: adding an explicit route to web.php for each of the index pages. So those additional routes look like this:
I'm not 100% sure why, but this seems to solve the problem. I've tested by building locally a few times, then pushed to CloudFlare Pages. It seems all of them are working correctly every time now.