Change template for existing content

I’m reworking an existing page and apparently when I built it initially I was too lazy to set up dedicated file blueprints.

Now I want to create an “images” section, but when I set template: image, the section contains nothing, because all files have the default blueprint. Any hints for creating a script to change all image files’ templates to image without losing existing content in their respective fields? I’m scared of losing content :smiley:

  1. Make a backup!
  2. Loop through all files (you can do this in a template/controller or a dedicated route.

Here is an example route:

[
            'pattern' => 'update-template',
            'action'  => function() {
                if ( ! kirby()->user() ) {
                    go('error');
                }
                foreach( site()->index()->images() as $file ) {
                    $file->update([
                        'template' => 'image'
                    ]);
                }
            }
        ]

If you have hundreds or thousands of files, you might run into a script runtime error, so make sure your PHP settings are fine or do it in chunks.

1 Like

Thanks a lot, it worked like a charm! :dizzy:

If in the future I want to target only children of a specific page, would it work like

foreach(page('somepage')->index()->images() as $file)

?

Yes, exactly! Or you could filter by other criteria, like if a template is already assigned, by extension or whatever you feel up to.

1 Like