{"id":2431,"date":"2026-04-02T17:19:37","date_gmt":"2026-04-02T17:19:37","guid":{"rendered":"https:\/\/www.danielpradilla.info\/blog\/?p=2431"},"modified":"2026-04-02T17:19:43","modified_gmt":"2026-04-02T17:19:43","slug":"mambo-rescue","status":"publish","type":"post","link":"https:\/\/www.danielpradilla.info\/blog\/mambo-rescue\/","title":{"rendered":"mambo-rescue"},"content":{"rendered":"<p><strong>Rescuing an old website without turning it into a life project<\/strong><\/p>\n<p>A few days ago, I finally got around to something I\u2019d been putting off since about 2012: cleaning up a mess on one of my old websites. One part is still plain HTML. Another runs on WordPress. And in the middle, for a few years, it ran on Mambo CMS, which means one layer of the site is frozen in a very specific moment of the PHP internet.<\/p>\n<p>That middle layer was the reason I didn\u2019t want to touch this site.<\/p>\n<p>The obvious option was to do the boring thing: migrate everything to WordPress, unify the stack, review extensions, clean up the database assumptions, and come out the other side with something respectable by 2026 standards.<\/p>\n<p>But I knew that was exactly how a two-hour project turns into a two-week one, with regressions all over the place. And for a site like this, with not that many visitors, the payoff just wasn\u2019t there. That kind of purity can become its own form of vandalism.<\/p>\n<p>I wanted something simpler: make the old HTML site findable by Google, get that Mambo slice running on PHP 8, make sure those three layers didn\u2019t step on each other, and not break any permalinks.<\/p>\n<p>I finally tackled this in 2026 thanks to my new AI superpowers.<\/p>\n<p>I asked Codex to assess and fix the SEO issues in the legacy HTML part of the site. It took about 30 minutes. I\u2019m pretty sure it would have taken dozens of hours to do by hand.<\/p>\n<p>Mambo CMS was abandoned three or four PHP versions ago, maybe more, who knows. None of that part of the site worked. Not a single screen would load.<\/p>\n<p>For the Mambo side, I could have tried to migrate the whole codebase to PHP 8. But that would have turned into a full migration of a messy old system, and I was almost certain I\u2019d break working behavior just by touching the code.<\/p>\n<p>So I went with a modest workaround. Instead of trying to modernize Mambo itself, I built a compatibility layer around the specific things that were breaking. Most of what broke brought back old memories of how ugly PHP used to be: <code>mysql_*<\/code>, <code>ereg*<\/code>, <code>split()<\/code>, <code>each()<\/code>, and the old magic quotes helpers.<\/p>\n<p>The solution came down to three parts:<\/p>\n<ol>\n<li>A PHP 8 shim that restores a subset of legacy functions, mapping <code>mysql_*<\/code> calls to <code>mysqli_*<\/code> and the regex pieces to <code>preg_*<\/code>.<\/li>\n<li>A bootstrap include loaded early in the Mambo entry point, before the rest of the code gets a chance to explode.<\/li>\n<li>A tiny installer so the process can be repeated without manually patching files every time.<\/li>\n<\/ol>\n<p>The important thing was to be clear about what this is <em>not<\/em>. It is not a migration, it does not make Mambo modern, doesn&#x27;t solve every problem inside old plugins or third-party code, doesn&#x27;t redeem years of technical debt. It just gives a dead Mambo installation enough support to serve content under PHP 8.<\/p>\n<p>In the end, I spun that work off into a small open source project because this feels like a recurring problem, not a one-off. Somewhere out there, maybe someone else is looking for a way not to rebuild the whole house, just to get the windows to open again.<\/p>\n<p>The code is here: <a href=\"https:\/\/github.com\/danielpradilla\/mambo-rescue\">danielpradilla\/mambo-rescue<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Rescuing an old website without turning it into a life project A few days ago, I finally got around to something I\u2019d been putting off since about 2012: cleaning up a mess on one of my old websites. One part is still plain HTML. Another runs on WordPress. And in the middle, for a few&hellip; <a class=\"more-link\" href=\"https:\/\/www.danielpradilla.info\/blog\/mambo-rescue\/\">Continue reading <span class=\"screen-reader-text\">mambo-rescue<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":2432,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[331],"tags":[],"class_list":["post-2431","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software-development-en-en","entry"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2026\/04\/mambo-rescue.jpg","jetpack_shortlink":"https:\/\/wp.me\/p1tlzy-Dd","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":2306,"url":"https:\/\/www.danielpradilla.info\/blog\/classifying-convolutional-neural-network-keras\/","url_meta":{"origin":2431,"position":0},"title":"Classifying fruits with a Convolutional Neural Network in Keras","author":"Daniel Pradilla","date":"19\/02\/2019","format":false,"excerpt":"I followed a tutorial on Convolutional Neural Networks that left many questions unanswered. Soon I realized that the actual process of architecting a Neural Network and setting the parameters seemed to be much more experimental than I thought. It took a while to find explanations that a rookie like me\u2026","rel":"","context":"In &quot;Best of&quot;","block_context":{"text":"Best of","link":"https:\/\/www.danielpradilla.info\/blog\/category\/bestof\/"},"img":{"alt_text":"Photo by William Felker on Unsplash","src":"https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2019\/02\/william-felker-38344-unsplash.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2019\/02\/william-felker-38344-unsplash.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2019\/02\/william-felker-38344-unsplash.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2019\/02\/william-felker-38344-unsplash.jpg?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":2242,"url":"https:\/\/www.danielpradilla.info\/blog\/getting-ip-location-information-with-angular-7\/","url_meta":{"origin":2431,"position":1},"title":"Getting IP location information with Angular 7","author":"Daniel Pradilla","date":"01\/11\/2018","format":false,"excerpt":"Using Angular Maps Components and a new service called ipapi, you will be able to quickly put together something that will allow you to get IP information from a client and put it on a map. Angular Maps Components is really great, and the setup with ipapi is a no-brainer\u2026","rel":"","context":"In &quot;Software Dev.&quot;","block_context":{"text":"Software Dev.","link":"https:\/\/www.danielpradilla.info\/blog\/category\/software-development-en-en\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2018\/11\/ipapi.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2018\/11\/ipapi.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2018\/11\/ipapi.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2018\/11\/ipapi.jpg?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":2012,"url":"https:\/\/www.danielpradilla.info\/blog\/free-mongodb-training\/","url_meta":{"origin":2431,"position":2},"title":"How I fell in love with MongoDB","author":"Daniel Pradilla","date":"01\/10\/2013","format":false,"excerpt":"I just finished the developer and DBA tracks of the two online MongoDB on-line trainings. The courses are excellent, providing all you need to know to start working as a developer or DBA with MongoDB. And, uh... they're free! I have taken several online courses and seen a lot of\u2026","rel":"","context":"In &quot;Project Mgmt.&quot;","block_context":{"text":"Project Mgmt.","link":"https:\/\/www.danielpradilla.info\/blog\/category\/projectmanagement-en\/"},"img":{"alt_text":"mongo-db-logo","src":"https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2013\/10\/mongo-db-logo.png?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2013\/10\/mongo-db-logo.png?resize=350%2C200 1x, https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2013\/10\/mongo-db-logo.png?resize=525%2C300 1.5x"},"classes":[]},{"id":1973,"url":"https:\/\/www.danielpradilla.info\/blog\/improve-sap-business-objects\/","url_meta":{"origin":2431,"position":3},"title":"How to improve your Business Objects charts","author":"Daniel Pradilla","date":"13\/08\/2013","format":false,"excerpt":"Business Objects, SAP's BI platform, is notoriously bad for data visualization. Somehow, it empowers the developers to make all the wrong decisions at the same time and create really ugly and unusable \"dashboards\". Lately, I've seen my share of ugly bobip visualizations, like the one above. Which would seem ok\u2026","rel":"","context":"In &quot;Project Mgmt.&quot;","block_context":{"text":"Project Mgmt.","link":"https:\/\/www.danielpradilla.info\/blog\/category\/projectmanagement-en\/"},"img":{"alt_text":"disaster, disguised as a \"dashboard\"","src":"https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2013\/08\/Slide-5-SAP-BusinessObjects-4.0-Event-Insight2.jpg?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2013\/08\/Slide-5-SAP-BusinessObjects-4.0-Event-Insight2.jpg?resize=350%2C200 1x, https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2013\/08\/Slide-5-SAP-BusinessObjects-4.0-Event-Insight2.jpg?resize=525%2C300 1.5x"},"classes":[]},{"id":1913,"url":"https:\/\/www.danielpradilla.info\/blog\/how-to-organize-yourself-find-time-to-work-and-be-happy-in-the-process\/","url_meta":{"origin":2431,"position":4},"title":"How to organize yourself, find time to work and be happy in the process","author":"Daniel Pradilla","date":"04\/02\/2013","format":false,"excerpt":"This article belongs to the\u00a0telecommuting and geographical independence\u00a0series. It doesn't matter what your job is about, the routine is the same every day and it starts early in the morning: emails, news, events, requests and if you use a computer to work, the situation is even worse: Twitter, Facebook and\u2026","rel":"","context":"In &quot;Lifestyle&quot;","block_context":{"text":"Lifestyle","link":"https:\/\/www.danielpradilla.info\/blog\/category\/lifestyle\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.afinidades.org\/wp-content\/uploads\/2010\/12\/to-do-list-nothing1.jpeg?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":2302,"url":"https:\/\/www.danielpradilla.info\/blog\/aws-lambda-python\/","url_meta":{"origin":2431,"position":5},"title":"10 things I learned while deploying my first python function to AWS Lambda","author":"Daniel Pradilla","date":"04\/01\/2019","format":false,"excerpt":"I spent a few days on and off trying to deploy a Flask REST service to AWS Lambda, just to experience what the cool kids were talking about. These are some of the things I learned along the way: \u00a0 Zappa is the easiest packager\/deployer for python (as of December\u2026","rel":"","context":"In &quot;Software Dev.&quot;","block_context":{"text":"Software Dev.","link":"https:\/\/www.danielpradilla.info\/blog\/category\/software-development-en-en\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.danielpradilla.info\/blog\/wp-content\/uploads\/2019\/01\/AWS-Lambda-290x300.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.danielpradilla.info\/blog\/wp-json\/wp\/v2\/posts\/2431","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.danielpradilla.info\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.danielpradilla.info\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.danielpradilla.info\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.danielpradilla.info\/blog\/wp-json\/wp\/v2\/comments?post=2431"}],"version-history":[{"count":0,"href":"https:\/\/www.danielpradilla.info\/blog\/wp-json\/wp\/v2\/posts\/2431\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.danielpradilla.info\/blog\/wp-json\/wp\/v2\/media\/2432"}],"wp:attachment":[{"href":"https:\/\/www.danielpradilla.info\/blog\/wp-json\/wp\/v2\/media?parent=2431"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.danielpradilla.info\/blog\/wp-json\/wp\/v2\/categories?post=2431"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.danielpradilla.info\/blog\/wp-json\/wp\/v2\/tags?post=2431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}