The problem
A site of 156 pages needed to move from Joomla to WordPress. Migrating that much content in a single pass on shared hosting hits the PHP execution time limit long before it finishes, and a migration that dies halfway leaves you worse off than when you started.
The concept
Stop treating the migration as one long request. Break it into batches small enough that no single request comes close to the server timeout, and let the browser drive the sequence.
What I built
A custom WordPress plugin that read the Joomla content, mapped it into WordPress posts and pages, and moved all 156 pages across without a timeout.
Technical implementation
PHP for the migration logic and JavaScript driving AJAX requests from the browser. Each request handled a small batch and reported back, so progress was visible and a failure only ever affected one batch rather than the whole run. That is what made it safe to run on shared hosting.
What it taught me
Batching is the answer to most shared hosting limits. The constraint is rarely total work, it is how much you try to do inside one request.