Documentation

Using a CSV File as the Source of the Find and Replace Pairs with the CLI Addon

Recently a customer asked if it was possible to use a CSV file with WP Migrate DB Pro so they could perform a find and replace on their site, there were hundreds of URLs that needed replacing.

This isn’t a feature WP Migrate DB Pro supports out of the box, but with some custom code and the CLI addon, it is possible to use a CSV file, and save yourself a lot of time!

Requirements

First of all you will need to have the WP Migrate DB Pro plugin, its CLI addon, and WP CLI installed, as we will be running a WP CLI command to perform a find and replace on the site’s database.

You will also need to have the CSV with all the find and replace data in two columns, eg.

//foo.com,//bar.com
//oldsite.com,//newsite.com

Next you will need to upload the CSV file to the site. The following code snippet assumes the file will be in your /wp-content/uploads/ directory, and called “urls.csv”, but this can be changed if you need to.

Finally, create a new file called wpmdb-cli-csv-find-replace.php in your wp-content/mu-plugins directory. If mu-plugins doesn’t exist, then create it first.

Copy the code below into that file:

<?php

function my_add_csv_find_replace_pairs( $profile ) {
    if ( 'find_replace' !== $profile['action'] ) {
        return $profile;
    }

    $csv_filename = 'urls.csv';
    $csv_delimiter = ',';

    $uploads  = wp_upload_dir();
    $csv_path = $uploads['basedir'] . '/' . $csv_filename;

    $csv_file = fopen( $csv_path, "r" );
    if ( ! $csv_file ) {
        return $profile;
    }

    $find    = array();
    $replace = array();

    while ( false !== ( $data = fgetcsv( $csv_file, 1000, $csv_delimiter ) ) ) {
        $find[]    = $data[0];
        $replace[] = $data[1];
    }

    fclose( $csv_file );

    if ( ! empty( $find ) && ! empty( $replace ) ) {
        $profile['replace_old'] = array_merge( array( '' ), $find );
        $profile['replace_new'] = array_merge( array( '' ), $replace );
    }

    return $profile;
}

add_filter( 'wpmdb_cli_filter_get_profile_data_from_args', 'my_add_csv_find_replace_pairs' );

The CSV filename, path and delimiter string can be changed depending on your file and where you place it.

Lastly, run the WP Migrate DB Pro CLI command to perform a find and replace. I’m using rubbish values as the arguments in the command, otherwise the command won’t run, but these will be ignored and the CSV data will be used:

wp migratedb find-replace --find="foo" --replace="bar"

Once you’ve performed the migration and you are happy the data has been replaced, you can remove the mu-plugin file.