How I Built It is Officially Hosted by Castos!
Castos is a fantastic WordPress-centric podcast hosting platform that I’ve been recommending in my courses and coaching calls. But I have a confession to make: since Castos launched after I launched my podcast, I’ve been using Libsyn.
For a long time, I’ve considered making the switch, but the migration process always seemed so daunting. On top of that, I’d need to make updates to my website and it never felt like the right time. Well that changes today!
With an assist from the Castos team, How I Built It has completed migrated over, using Castos as a host, and Seriously Simple Podcasting plugin. Here’s how it worked.
Moving Hosts
First, I’m using Libsyn for the audio hosting part, and Powerpress for the WordPress plugin. So the Castos team went into my site, turned on their plug, and did the migration, which included moving all published and scheduled episodes to their plugin (this was super easy because they support the same post types that Powerpress does).
On top of that, they made sure all of my audio files moved from Libsyn to their system. Because I’m using my website as the Apple Podcast feed, and not Libsyn’s URL, there will be no need to redirect any feeds, which is great. Subscribers should see absolutely no difference on their end.
Once the migration finished, they double checked everything, and I turned off the Powerpress plugin.
Code Support for Seriously Simple Podcasting
Along with moving hosts and plugins, I needed to update my child theme and custom plugin, as there are dependencies on Powerpress. It wasn’t too bad, but I needed to do a few things to make sure nothing broke
- Update my custom fields so they show up on the Castos plugin’s Episode post type as well as of Posts in the “Episodes” category.
- Update the episodes archives template to use Castos’.
- Update my Fusebox integration plugin to pull the audio file from Castos’ plugin.
- Associate Sponsors and Templates with the Episode post type.
As it turns out I didn’t really need to do a lot of this since I’m still using posts – but that’s OK. Now I can support the Castos plugin fully, which will come in handy if I want to add different series to the same site.
Site Improvements and Updates
Since I was banging around in the code to make sure the migration went smoothly, there were several improvements I wanted to make to my plugins and child theme to make the site work better:
- Better formatting for transcripts (on episode pages, it was just a block of text.
wpautop()
fixed that. - Email guests only on Publish, not when I update posts
- Consolidate my custom fields managers (I was using two. More on that below).
- Improve my Fusebox integration plugin. This feels like a good candidate for a premium plugin.
Removing Fields Manager
I was using the Fields Manager library for my custom fields at the recommendation of a (then) coworker. I figured if I’d be using it a lot so I might as well use it, and then…well a lot of things changed. Honestly, I wish I stuck with CMB2 because I was more familiar with that and it seems better supported.
Because of my feelings towards that library, when it came time to add extra info to my post types and posts, I just went with Advanced Custom Fields (ACF) because it was faster, and their complex fields are what I needed. Thus, 2 fields managers were in use.
I’ll spare the details for a more dev-heavy post, but luckily Fields Manager (FM) and ACF handle data pretty much the same, so I wrote a conversion script to make all of the data out of FM and into ACF. It worked perfectly and required little update to move code, besides moving the FM dependency. You can find the function I wrote in this gist.
Other Changes
There were 3 other changes I made at the same time as these updates:
- Replace the Quick Redirects plugin with the Redirection plugin. It’s better, with more options. The only struggle I had was creating redirects in PHP because there’s no sample code and the documentation was a bit unclear.
- Replace Yoast SEO. It’s more than I need, and not worth the constant notifications on this site. I’ve been trying out Slim SEO.
- Add a podcast subscription plugin to replace Powerpress’ widget. This was a great feature – I’m told Seriously Simple Podcasting is adding one soon, but the Podcast Subscriptions Button plugin is very good.
Testing the Full Migration
I also created a test plan, once everything was complete. This revealed a few issues that needed resolving, so I’m glad I did it! So I cleared the cache and performed the following tasks:
- Check all meta data on episodes (sponsors, transcripts)
- Test all pages on front end to make sure they’re still displaying properly
- Check links and redirects
- Check the feed in Apple Podcasts, Spotify, and Google Podcasts
- Check Podtrac (my stats service)
- View the site in Chrome, Safari, Firefox, and on mobile devices
- Add a new episode
- Publish an episode (happening Tuesday)
Everything went pretty well – I did need to fix a few issues but nothing that completely broke the site, or more importantly, the feed.
Notice Anything Strange?
If you’re bouncing around the site or the feed in your favorite app, let me know! I’m sure while my tests checked out, they weren’t full comprehensive.
And if you want to check out Castos, you can do so here. Not only am I a fan of their work, but moving over to them has saved me a bit of money 🙂
Finally, if you have any questions about the migration process, let me know!
PS – You can find my custom plugin, WP Podcatcher, over on Github. It’s pretty dependent on both Seriously Simple Podcasting and ACF, so I don’t know how useful it is to you. But there are some nifty code gems.
Update!
There was a small snafu regarding episode URLs because of my web host, Liquid Web, and nginx (the underlying server engine). Thankfully, the Castos team knew exactly what was wrong and we added this bit of code to my plugin (it will also work in your theme’s functions.php file:
add_filter( 'ssp_episode_download_link', 'ssp_use_raw_audio_file_url', 10, 3 );
function ssp_use_raw_audio_file_url ( $url, $episode_id, $file ) {
return $file;
}