| | 3653 | * @param string Slug name without suffix |
| | 3654 | * @param array Naturally sorted array |
| | 3655 | */ |
| | 3656 | function _get_first_available_slug($base_slug, $arr) { |
| | 3657 | $base_slug = _truncate_post_slug($base_slug); |
| | 3658 | |
| | 3659 | $suffix = 2; // if this function was called, then the base name has been taken |
| | 3660 | // (that is $base_slug is the first item of the array) |
| | 3661 | |
| | 3662 | for ($i = 1; $i < count($arr); $i++) { |
| | 3663 | $suffix = $i + 1; |
| | 3664 | |
| | 3665 | $actual_suffix = substr($arr[$i], strlen($base_slug) + 1); |
| | 3666 | |
| | 3667 | if ($suffix != $actual_suffix) |
| | 3668 | break; |
| | 3669 | elseif ($i == count($arr) - 1) |
| | 3670 | $suffix++; |
| | 3671 | } |
| | 3672 | |
| | 3673 | return _truncate_post_slug( $base_slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-{$suffix}"; |
| | 3674 | } |
| | 3675 | |
| | 3676 | /** |
| | 3677 | * Gets a unique post slug using a supplied SQL query for getting the latest appropriate slug. |
| | 3678 | * |
| | 3679 | * @global wpdb $wpdb WordPress database abstraction object. |
| | 3680 | * |
| | 3681 | * @param string $slug The desired slug (post_name). |
| | 3682 | * @param string $similar_slugs_sql An SQL query returning the latest appropriate slug. |
| | 3683 | * @param array $prep_args Parameters for the SQL query for using in $wpdb->prepare() call. |
| | 3684 | */ |
| | 3685 | function _get_unique_post_slug( $slug, $similar_slugs_sql, $prep_args ) { |
| | 3686 | global $wpdb; |
| | 3687 | |
| | 3688 | $similar_slugs_prep = $wpdb->prepare($similar_slugs_sql, $prep_args); |
| | 3689 | $slugs = $wpdb->get_col($similar_slugs_prep); |
| | 3690 | $slug = _get_first_available_slug($slug, $slugs); |
| | 3691 | |
| | 3692 | return $slug; |
| | 3693 | } |
| | 3694 | |
| | 3695 | /** |
| 3693 | | $suffix = 2; |
| 3694 | | do { |
| 3695 | | $alt_post_name = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix"; |
| 3696 | | $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $post_ID ) ); |
| 3697 | | $suffix++; |
| 3698 | | } while ( $post_name_check ); |
| 3699 | | $slug = $alt_post_name; |
| | 3736 | $similar_slugs_sql = "SELECT post_name FROM $wpdb->posts WHERE (post_name = %s OR post_name RLIKE %s) AND ID != %d ORDER BY LENGTH(post_name), post_name"; |
| | 3737 | $slug = _get_unique_post_slug($slug, $similar_slugs_sql, array($slug, $wpdb->esc_like("^{$slug}-[0-9]+\$"), $post_ID)); |
| 3723 | | $suffix = 2; |
| 3724 | | do { |
| 3725 | | $alt_post_name = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix"; |
| 3726 | | $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $post_type, $post_ID, $post_parent ) ); |
| 3727 | | $suffix++; |
| 3728 | | } while ( $post_name_check ); |
| 3729 | | $slug = $alt_post_name; |
| | 3760 | $similar_slugs_sql = "SELECT post_name FROM $wpdb->posts WHERE (post_name = %s OR post_name RLIKE %s) AND post_type IN ( %s, 'attachment' ) AND ID != %d AND post_parent = %d ORDER BY LENGTH(post_name), post_name"; |
| | 3761 | $slug = _get_unique_post_slug($slug, $similar_slugs_sql, array($slug, $wpdb->esc_like("^{$slug}-[0-9]+\$"), $post_type, $post_ID, $post_parent)); |
| 3768 | | $suffix = 2; |
| 3769 | | do { |
| 3770 | | $alt_post_name = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix"; |
| 3771 | | $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $post_type, $post_ID ) ); |
| 3772 | | $suffix++; |
| 3773 | | } while ( $post_name_check ); |
| 3774 | | $slug = $alt_post_name; |
| | 3800 | $similar_slugs_sql = "SELECT post_name FROM $wpdb->posts WHERE (post_name = %s OR post_name RLIKE %s) AND post_type = %s AND ID != %d ORDER BY LENGTH(post_name), post_name"; |
| | 3801 | $slug = _get_unique_post_slug($slug, $similar_slugs_sql, array($slug, $wpdb->esc_like("^{$slug}-[0-9]+\$"), $post_type, $post_ID)); |