How to automate moving WordPress custom field values into taxonomy selections

One of our event sites had a few hundred posts, one for each customer presentation given at a company event.  When I first set up the custom post type two years ago, I used a field for city and year. But I realized that this had some limitations…  A better way would have been to set up a custom taxonomy for city and year so that I’d be able to do things like use the WordPress back-end interface to quickly show all presentations in a certain year, or certain city.

Not too tough a task…  I would just create the new taxonomies, and then hunker down and open each post, manually click the year and city, save, and move on to the next post.  But then this morning’s shower epiphany struck– I bet I could use wp cli to automate this whole project!

After about an hour of learning the (rather poorly documented) wp cli structure, I was able to come up with this process to automate the migration.  Here’s how I did it.

Converting Wordpress field to taxonomies

Prerequisites

  • SSH access to your server
  • wp cli installed
  • Empty destination taxonomies built

Instructions

Step 1: Export the current custom field values to a CSV

I wrote a quick shortcode to dump all of the current settings for all posts to the screen. I then saved that to a CSV and imported it into Excel where I could manipulate the strings.

The resulting output looked like this:

id year city
624 2011 Chicago
638 2011 Paris
644 2011 Paris
665 2011 Paris

Step 2: Build the commands in Excel

Now that you have a list of all posts you want to operate on and their values, we can use Excel to build formulae that output the wp cli commands that we want to run on the server.

I needed to update two taxonomies, but I’ll only show one here for the sake of brevity.

For this operation, I want to take the value stored in the year field and make it tags under the year-presentation taxonomy.  The formula I used in Excel to build my commands was:

="wp post term set "&A2&" year-presentation "&B2

And that gave me a column which contained all of the commands I needed to run.

id year city command
624 2011 Chicago wp post term set 624 year-presentation 2011
638 2011 Paris wp post term set 638 year-presentation 2011
644 2011 Paris wp post term set 644 year-presentation 2011
665 2011 Paris wp post term set 665 year-presentation 2011

One word of caution — some city names had two words in them, like Fort Worth and San Diego. I didn’t take that into account before running the following command:

wp post term set 1403 city-presentation fort worth

That created two new tags, fort and worth, for each post that had Fort Worth selected as the city. I needed to pass fort-worth as the tag instead, like this:

wp post term set 1403 city-presentation fort-worth

Step 3: Run the commands on the server

Just copy and paste those commands into your SSH console and let wp cli do all the work!

Conclusion

This was the first time that I used wp cli to do any heavy lifting on a site, and I can safely say that it allowed me to do a ton of work in a fraction of the time it would have taken to do by hand, and with far fewer human errors. By building the list of commands in Excel I was able to keep track of all of the operations and even recover from the accidental double tag issue with two-word city names.

I hope this guide helps you use wp cli to automate some process for your site.

PS: The wp cli documentation isn’t terrible, but it’s lacking command line examples that would have really helped a beginner like me out. Perhaps one day I’ll contribute to that site, too.