Giving each page an auto number

I need to give each page a unique number, going up in increments of 1.

I am really not sure how to do this. I guess I need to create a global field and then increment this field on the page save hook. At the same time I will save this value to a field on the page itself? Is there a better approach?

not sure if you can set your own identification though…

other than that you could just have a plugin function which reads out the field, sort by biggest value, increments and saves if the field is empty…

both approaches are with saving inside a field…

i previously had something like

  • parent page with number field
  • child page with number field

hook => read parent page current number => write current number +1 to child => update parent to this number

currently i am going a different approach… i have a model to turn my sqlite data into children pages, while there i can set ID’s, to be unique and auto increment or count rows as desired… this also does not use a parent page saving the number, as sqlite is faster than alot of pages and we could run Db::max any time and increment it by one…

Yes, this is what I was thinking of doing - any chance you can dig the code out? :slight_smile:

What is your use case?

I am creating invoices with kirby - every time I create a new one I want an auto incrementing reference assigned to the page this:



In this case a hook makes the most sense, I think.

Ok, that was easy - I :hearts: Kirby

'hooks' => [
        'page.create:after' => function ($page) {

          $newid = site()->invstart()->int() + 1;
                  'ref' => $newid

            'invstart' => $newid

1 Like

There is a very nice method for you: increment()

For site

For page


in this invoicing example. what if the increment code is triggered a few times just within a second or two, will that lead to potentially also having a duplicate number if the script/loading is rather slow, or it’s not gonna happen. like a couple of executions will overlap with the same number.

e.g. in case of a shop with more traffic…

and if it is, what would be a smart way to avoid it.