+
+/**
+ * Given the desired slug and some post details computes a unique slug for the post.
+ *
+ * @param string $slug the desired slug (post_name)
+ * @param integer $post_ID
+ * @param string $post_status no uniqueness checks are made if the post is still draft or pending
+ * @param string $post_type
+ * @param integer $post_parent
+ * @return string unique slug for the post, based on $post_name (with a -1, -2, etc. suffix)
+ */
+function wp_unique_post_slug($slug, $post_ID, $post_status, $post_type, $post_parent) {
+ if ( in_array( $post_status, array( 'draft', 'pending' ) ) )
+ return $slug;
+
+ global $wpdb, $wp_rewrite;
+ $hierarchical_post_types = apply_filters('hierarchical_post_types', array('page'));
+ if ( 'attachment' == $post_type ) {
+ // Attachment slugs must be unique across all types.
+ $check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND ID != %d LIMIT 1";
+ $post_name_check = $wpdb->get_var($wpdb->prepare($check_sql, $slug, $post_ID));
+
+ if ( $post_name_check || in_array($slug, $wp_rewrite->feeds) ) {
+ $suffix = 2;
+ do {
+ $alt_post_name = substr($slug, 0, 200-(strlen($suffix)+1)). "-$suffix";
+ $post_name_check = $wpdb->get_var($wpdb->prepare($check_sql, $alt_post_name, $post_ID));
+ $suffix++;
+ } while ($post_name_check);
+ $slug = $alt_post_name;
+ }
+ } elseif ( in_array($post_type, $hierarchical_post_types) ) {
+ // Page slugs must be unique within their own trees. Pages are in a
+ // separate namespace than posts so page slugs are allowed to overlap post slugs.
+ $check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type IN ( '" . implode("', '", $wpdb->escape($hierarchical_post_types)) . "' ) AND ID != %d AND post_parent = %d LIMIT 1";
+ $post_name_check = $wpdb->get_var($wpdb->prepare($check_sql, $slug, $post_ID, $post_parent));
+
+ if ( $post_name_check || in_array($slug, $wp_rewrite->feeds) ) {
+ $suffix = 2;
+ do {
+ $alt_post_name = substr($slug, 0, 200-(strlen($suffix)+1)). "-$suffix";
+ $post_name_check = $wpdb->get_var($wpdb->prepare($check_sql, $alt_post_name, $post_ID, $post_parent));
+ $suffix++;
+ } while ($post_name_check);
+ $slug = $alt_post_name;
+ }
+ } else {
+ // Post slugs must be unique across all posts.
+ $check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type = %s AND ID != %d LIMIT 1";
+ $post_name_check = $wpdb->get_var($wpdb->prepare($check_sql, $slug, $post_type, $post_ID));
+
+ if ( $post_name_check || in_array($slug, $wp_rewrite->feeds) ) {
+ $suffix = 2;
+ do {
+ $alt_post_name = substr($slug, 0, 200-(strlen($suffix)+1)). "-$suffix";
+ $post_name_check = $wpdb->get_var($wpdb->prepare($check_sql, $alt_post_name, $post_type, $post_ID));
+ $suffix++;
+ } while ($post_name_check);
+ $slug = $alt_post_name;
+ }
+ }
+
+ return $slug;
+}
+