get_sample_permalink()WP 2.5.0

Get a sample permalink based off of the post name.

Hooks from the function

Return

Array. Array containing the sample permalink with placeholder for the post name, and the post name.

Usage

get_sample_permalink( $post, $title, $name );
$post(int|WP_Post) (required)
Post ID or post object.
$title(string|null)
Title to override the post's current title when generating the post name.
Default: null
$name(string|null)
Name to override the post name.
Default: null

Examples

0

#1 Demo

require_once ABSPATH . '/wp-admin/includes/post.php';

$sample_permalink = get_sample_permalink( 10262 );

/*
Array (
	[0] => https://wp-kama.com/%postname%.html
	[1] => customize-api
)
*/
0

#2 Examples of using other parameters

$sample_permalink = get_sample_permalink( 10262, 'My Title' );

/*
	[0] => https://example.com/%postname%.html
	[1] => customize-api
*/

$sample_permalink = get_sample_permalink( 10262, 'My Title', '' );
/*
	[0] => https://example.com/%postname%.html
	[1] => my-title
*/

$sample_permalink = get_sample_permalink( 10262, 'My title', 'If you specify a name' );
/*
	[0] => https://example.com/%postname%.html
	[1] => if-you-specify-a-name
*/

Changelog

Since 2.5.0 Introduced.

get_sample_permalink() code WP 6.5.2

function get_sample_permalink( $post, $title = null, $name = null ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return array( '', '' );
	}

	$ptype = get_post_type_object( $post->post_type );

	$original_status = $post->post_status;
	$original_date   = $post->post_date;
	$original_name   = $post->post_name;
	$original_filter = $post->filter;

	// Hack: get_permalink() would return plain permalink for drafts, so we will fake that our post is published.
	if ( in_array( $post->post_status, array( 'draft', 'pending', 'future' ), true ) ) {
		$post->post_status = 'publish';
		$post->post_name   = sanitize_title( $post->post_name ? $post->post_name : $post->post_title, $post->ID );
	}

	/*
	 * If the user wants to set a new name -- override the current one.
	 * Note: if empty name is supplied -- use the title instead, see #6072.
	 */
	if ( ! is_null( $name ) ) {
		$post->post_name = sanitize_title( $name ? $name : $title, $post->ID );
	}

	$post->post_name = wp_unique_post_slug( $post->post_name, $post->ID, $post->post_status, $post->post_type, $post->post_parent );

	$post->filter = 'sample';

	$permalink = get_permalink( $post, true );

	// Replace custom post_type token with generic pagename token for ease of use.
	$permalink = str_replace( "%$post->post_type%", '%pagename%', $permalink );

	// Handle page hierarchy.
	if ( $ptype->hierarchical ) {
		$uri = get_page_uri( $post );
		if ( $uri ) {
			$uri = untrailingslashit( $uri );
			$uri = strrev( stristr( strrev( $uri ), '/' ) );
			$uri = untrailingslashit( $uri );
		}

		/** This filter is documented in wp-admin/edit-tag-form.php */
		$uri = apply_filters( 'editable_slug', $uri, $post );
		if ( ! empty( $uri ) ) {
			$uri .= '/';
		}
		$permalink = str_replace( '%pagename%', "{$uri}%pagename%", $permalink );
	}

	/** This filter is documented in wp-admin/edit-tag-form.php */
	$permalink         = array( $permalink, apply_filters( 'editable_slug', $post->post_name, $post ) );
	$post->post_status = $original_status;
	$post->post_date   = $original_date;
	$post->post_name   = $original_name;
	$post->filter      = $original_filter;

	/**
	 * Filters the sample permalink.
	 *
	 * @since 4.4.0
	 *
	 * @param array   $permalink {
	 *     Array containing the sample permalink with placeholder for the post name, and the post name.
	 *
	 *     @type string $0 The permalink with placeholder for the post name.
	 *     @type string $1 The post name.
	 * }
	 * @param int     $post_id Post ID.
	 * @param string  $title   Post title.
	 * @param string  $name    Post name (slug).
	 * @param WP_Post $post    Post object.
	 */
	return apply_filters( 'get_sample_permalink', $permalink, $post->ID, $title, $name, $post );
}