Yes, you could use a plugin to bulk search and replace a given string inside the WordPress database… but today I want to show you a simple snippet you can use to bulk edit SKUs in your store (please test first on staging or a development site!).
Specifically, we will replace dashes “-” with an empty string (i.e. we will remove dashes from all products’ SKU), but you can of course readapt this and for example add suffixes, remove prefixes, replace special characters and so on. Enjoy!
PHP Snippet: Bulk Replace SKUs @ WooCommerce Admin
Please note that in order to trigger the bulk update you must add the “bb-edit-products” URL parameter to any WordPress dashboard URL when you’re logged in as administrator or shop manager, and hit enter.
The Action Scheduler’s as_enqueue_async_action() function will schedule one event per visible product. The event will then trigger the bbloomer_edit_product_schedule() function for each product ID, and specifically this will get the SKU, edit it, and save it.
/**
* @snippet Bulk replace SKUs
* @how-to businessbloomer.com/woocommerce-customization
* @author Rodolfo Melogli, Business Bloomer
* @compatible WooCommerce 7
* @community https://businessbloomer.com/club/
*/
add_action( 'admin_init', 'bbloomer_edit_products_admin' );
function bbloomer_edit_products_admin() {
if ( isset( $_REQUEST['bb-edit-products'] ) ) {
if ( ! current_user_can( 'manage_woocommerce' ) ) {
wp_die( 'You do not have permission to bulk edit products' );
}
$args = array(
'status' => 'publish',
'visibility' => 'visible',
'limit' => -1,
'sku' => '-',
'return' => 'ids',
);
$products = wc_get_products( $args );
foreach ( $products as $product_id ) {
as_enqueue_async_action( 'bbloomer_edit_product_schedule_trigger', array( $product_id ) );
}
}
}
add_action( 'bbloomer_edit_product_schedule_trigger', 'bbloomer_edit_product_schedule' );
function bbloomer_edit_product_schedule( $product_id ) {
$product = wc_get_product( $product_id );
$sku = $product->get_sku();
$newsku = str_replace( "-", "", $sku );
$product->set_sku( $newsku );
$product->save();
}