function glsr_reassign_reviews(int $assignedPostId = 0, array $newAssignedPostIds = [], int $per_page = 100) { // set_time_limit(0); // Uncomment only if necessary $delay_ms = 5000; $newAssignedPostIds = array_filter($newAssignedPostIds, 'is_numeric'); $processed = 0; $resumeKey = "glsr_reassign_reviews_last_page_{$assignedPostId}"; $stream_reviews = function (int $assignedPostId, int $start_page, int $per_page) use ($resumeKey): \Generator { $page = max(1, $start_page); while (true) { $reviews = glsr_get_reviews([ 'assigned_posts' => $assignedPostId, 'orderby' => 'ID', 'page' => $page, 'per_page' => max(1, $per_page), ]); if (1 === $page && empty($reviews->reviews)) { break; } if ($page >= $reviews->max_num_pages) { break; } foreach ($reviews->reviews as $review) { yield $review->ID; } $page++; update_option($resumeKey, $page); } } $last_page = get_option($resumeKey, 1); foreach ($stream_reviews($assignedPostId, $last_page, $per_page) as $reviewId) { glsr_update_review($reviewId, [ 'assigned_posts' => $newAssignedPostIds, ]); $processed++; if ($processed % 200 === 0) { glsr_log("Processed {$processed} reviews"); usleep($delay_ms); // delay every 200 reviews to reduce server load } } glsr_log("Finished processing {$processed} reviews"); delete_option($resumeKey); }