wp_unique_post_slug

Definition:
function wp_unique_post_slug( $slug, $post_ID, $post_status, $post_type, $post_parent ) {}

Computes a unique slug for the post, when given the desired slug and some post details.

Parameters

  • string $slug: the desired slug (post_name)
  • integer $post_ID
  • string $post_status: no uniqueness checks are made if the post is still draft or pending
  • string $post_type
  • integer $post_parent

Return values

returns:unique slug for the post, based on $post_name (with a -1, -2, etc. suffix)

Defined filters

  • wp_unique_post_slug_is_bad_attachment_slug
    apply_filters( 'wp_unique_post_slug_is_bad_attachment_slug', false, $slug )
  • wp_unique_post_slug_is_bad_hierarchical_slug
    apply_filters( 'wp_unique_post_slug_is_bad_hierarchical_slug', false, $slug, $post_type, $post_parent )
  • wp_unique_post_slug_is_bad_flat_slug
    apply_filters( 'wp_unique_post_slug_is_bad_flat_slug', false, $slug, $post_type )
  • wp_unique_post_slug
    apply_filters( 'wp_unique_post_slug', $slug, $post_ID, $post_status, $post_type, $post_parent )

Source code

function wp_unique_post_slug( $slug, $post_ID, $post_status, $post_type, $post_parent ) {

	if ( in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) )

		return $slug;



	global $wpdb, $wp_rewrite;



	$feeds = $wp_rewrite->feeds;

	if ( ! is_array( $feeds ) )

		$feeds = array();



	$hierarchical_post_types = get_post_types( array('hierarchical' => true) );

	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, $feeds ) || apply_filters( 'wp_unique_post_slug_is_bad_attachment_slug', false, $slug ) ) {

			$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( "', '", esc_sql( $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, $feeds ) || preg_match( "@^($wp_rewrite->pagination_base)?\d+$@", $slug )  || apply_filters( 'wp_unique_post_slug_is_bad_hierarchical_slug', false, $slug, $post_type, $post_parent ) ) {

			$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, $feeds ) || apply_filters( 'wp_unique_post_slug_is_bad_flat_slug', false, $slug, $post_type ) ) {

			$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 apply_filters( 'wp_unique_post_slug', $slug, $post_ID, $post_status, $post_type, $post_parent );

}

4193

No comments yet... Be the first to leave a reply!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: