Safely Change Status of Subpages

How to safely change status of set of subpages?
Currently iterating with a foreach loop through a set of subpages and changing status misses items as the total changes.

What do you mean exactly?

And could you please post your code?

This is a test case representative of what I am working on


$testPage = Page::factory([
  'slug' 	 => 'virtual',
  'template' => 'virtual',

for($i = 0; $i < 10; $i++) {
    'slug'    => 'child ' . $i,
    'status'  => 'draft', 

foreach($testPage->drafts() as $draft) {
  try {
    $unlisted = $draft->changeStatus('unlisted'); 
    // do something with unlisted... 
  catch(Exception $e) {

and log result

foreach($testPage->childrenAndDrafts() as $child) {
  dump($child->slug() . ' ' . $child->status()); 

child-0 unlisted
child-2 unlisted
child-4 unlisted
child-6 unlisted
child-8 unlisted
child-1 draft
child-3 draft
child-5 draft
child-7 draft
child-9 draft

Which Kirby version are you using? I can’t reproduce this.


Using 3.3.3

I copied your code into a template in a 3.3.3 Starterkit.

Where are you using this code? Any other custom code?

I deleted kirby and reinstalled - that fixed it. I’m not sure how but the installation have gotten corrupted. Thank you for the help.