Most of the time when working with meta fields I’ll use Advanced Custom Fields. One place where I don’t use ACF is within CaptainCore CLI where data is stored directly into meta fields using WP-CLI. I recently wanted to rename a bunch of meta fields for better organization. WordPress doesn’t have a built-in way to do that so this is how I handled it.
The following PHP script hunts for certain meta field names using metadata_exists
. If found it then creates a new meta field using update_post_meta
and then deletes the original meta field with delete_post_meta
. This works out nicely as it will also move over empty value records and cleanup the old meta keys/values.
With the following code put into a file named rename-meta-fields.php
this can be run over WP-CLI like so wp eval-file rename-meta-fields.php
. This can easily be adapted for any other bulk meta field renames by changing the arguments passed to get_posts
.
<?php
$arguments = array(
'post_type' => 'captcore_website',
'posts_per_page' => '-1',
'fields' => 'ids',
);
$websites = get_posts( $arguments );
foreach ( $websites as $post_id ) {
echo "Updated meta fields for $post_id\n";
if ( metadata_exists( 'post', $post_id, "homedir" ) ) {
update_post_meta( $post_id, "home_directory", get_post_meta( $post_id, "homedir", true ) );
delete_post_meta( $post_id, "homedir" );
}
if ( metadata_exists( 'post', $post_id, "homedir_staging" ) ) {
update_post_meta( $post_id, "home_directory_staging", get_post_meta( $post_id, "homedir_staging", true ) );
delete_post_meta( $post_id, "homedir_staging" );
}
}