WP-CLI script that checks for duplicate WooCommerce products

  • Save the script as check_duplicate_products.php in your WordPress root directory.

  • Run it via WP-CLI with

    wp eval-file check_duplicate_products.php
<?php
if ( ! defined( 'WP_CLI' ) || ! WP_CLI ) {
    die( 'This script must be run via WP-CLI.' );
}

function check_duplicate_products() {
    if ( ! class_exists( 'WooCommerce' ) ) {
        WP_CLI::error( 'WooCommerce is not active.' );
        return;
    }

    $args = array(
        'post_type'      => 'product',
        'post_status'    => 'publish',
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $products = get_posts( $args );

    if ( empty( $products ) ) {
        WP_CLI::log( 'No published products found.' );
        return;
    }

    $product_names = array();
    foreach ( $products as $product_id ) {
        $product_name = get_the_title( $product_id );
        if ( ! isset( $product_names[ $product_name ] ) ) {
            $product_names[ $product_name ] = array();
        }
        $product_names[ $product_name ][] = $product_id;
    }

    $duplicates = array_filter( $product_names, function( $ids ) {
        return count( $ids ) > 1;
    } );

    if ( empty( $duplicates ) ) {
        WP_CLI::success( 'No duplicate product names found.' );
        return;
    }

    WP_CLI::log( 'Found duplicate product names:' );
    $total_duplicates = 0;

    foreach ( $duplicates as $name => $ids ) {
        $count = count( $ids );
        $total_duplicates += $count - 1;
        WP_CLI::log( sprintf( 'Product Name: "%s" (Found %d times)', $name, $count ) );
        foreach ( $ids as $index => $id ) {
            $permalink = get_permalink( $id );
            WP_CLI::log( sprintf( '  - ID: %d, URL: %s', $id, $permalink ) );
        }
    }

    WP_CLI::success( sprintf( 'Completed! Found %d duplicate product name(s) across %d products.', count( $duplicates ), $total_duplicates ) );
}

check_duplicate_products();
?>

Last updated

Was this helpful?