WC_Admin_Duplicate_Product::generate_unique_slug()
Generates a unique slug for a given product. We do this so that we can override the behavior of wp_unique_post_slug(). The normal slug generation will run single select queries on every non-unique slug, resulting in very bad performance.
Method of the class: WC_Admin_Duplicate_Product{}
No Hooks.
Return
null
. Nothing (null).
Usage
// private - for code of main (parent) class only $result = $this->generate_unique_slug( $product );
- $product(WC_Product) (required)
- The product to generate a slug for.
Changelog
Since 3.9.0 | Introduced. |
WC_Admin_Duplicate_Product::generate_unique_slug() WC Admin Duplicate Product::generate unique slug code WC 9.5.1
private function generate_unique_slug( $product ) { global $wpdb; // We want to remove the suffix from the slug so that we can find the maximum suffix using this root slug. // This will allow us to find the next-highest suffix that is unique. While this does not support gap // filling, this shouldn't matter for our use-case. $root_slug = preg_replace( '/-[0-9]+$/', '', $product->get_slug() ); $results = $wpdb->get_results( $wpdb->prepare( "SELECT post_name FROM $wpdb->posts WHERE post_name LIKE %s AND post_type IN ( 'product', 'product_variation' )", $root_slug . '%' ) ); // The slug is already unique! if ( empty( $results ) ) { return; } // Find the maximum suffix so we can ensure uniqueness. $max_suffix = 1; foreach ( $results as $result ) { // Pull a numerical suffix off the slug after the last hyphen. $suffix = intval( substr( $result->post_name, strrpos( $result->post_name, '-' ) + 1 ) ); if ( $suffix > $max_suffix ) { $max_suffix = $suffix; } } $product->set_slug( $root_slug . '-' . ( $max_suffix + 1 ) ); }