get_permalink() │ WP 1.0.0
Gets the permalink for a post for further use in PHP.
Can be used outside the WordPress Loop ; for this you need to specify the first parameter - the ID of the post whose link you want to get.
Gets the URL for any post type : post, page and custom post type .
Note: If you do not specify the ID parameter and use this function outside the WordPress Loop on archive pages (category, date archive, author archive, etc.), the function will return the link to the last article output in the Loop of the current page, not the link to the current page.
Note: Does not echo the link to the screen, but returns it in a variable.
It is recommended to sanitize the result when outputting:
In HTML attrs: esc_url( get_permalink() )
As plain text: esc_html( get_permalink() )
For storage: esc_url_raw()
For redirect: wp_safe_redirect()
1 time — 0.0034161 sec (very slow) | 50000 times — 1.63 sec (fast) | PHP 7.4.8, WP 5.6.2
Returns
String|false .
string - the post URL.
false - if the post does not exist.
Usage
$url = get_permalink( $post, $leavename );
$post(int/object)
The ID or post object of the post whose link you want to get.
Default: 0 (ID of the current post)
$leavename(boolean)
Do not replace the post name in the link, i.e. do not replace the %postname% tag with the post name.
Default: false
Examples
#1 Get a link to the current post
Get a link to the post (inside the WordPress Loop). Since the function does not output data, you need to use php echo command:
<?php echo get_permalink(); ?>
It is equivalent to:
<?php the_permalink(); ?>
#2 Get links to certain posts
Let's output a list where we get links to pages with ID 1 and 10.
<ul>
<li><a href="<?php echo get_permalink(1); ?>">О блоге</a></li>
<li><a href="<?php echo get_permalink(10); ?>">Об авторе</a></li>
</ul>
#3 Use with the second parameter
Leave the tag %postname% unchanged, for example, we have such permalink structure /%post_id%/%postname%, then the function will work like this:
<?php echo get_permalink( 185, true ); ?>
// displays: http://example.com/185/%postname%
Add Your Own Example
Changelog
get_permalink() get permalink code
WP 7.0
function get_permalink( $post = 0, $leavename = false ) {
$rewritecode = array(
'%year%',
'%monthnum%',
'%day%',
'%hour%',
'%minute%',
'%second%',
$leavename ? '' : '%postname%',
'%post_id%',
'%category%',
'%author%',
$leavename ? '' : '%pagename%',
);
if ( is_object( $post ) && isset( $post->filter ) && 'sample' === $post->filter ) {
$sample = true;
} else {
$post = get_post( $post );
$sample = false;
}
if ( empty( $post->ID ) ) {
return false;
}
if ( 'page' === $post->post_type ) {
return get_page_link( $post, $leavename, $sample );
} elseif ( 'attachment' === $post->post_type ) {
return get_attachment_link( $post, $leavename );
} elseif ( in_array( $post->post_type, get_post_types( array( '_builtin' => false ) ), true ) ) {
return get_post_permalink( $post, $leavename, $sample );
}
$permalink = get_option( 'permalink_structure' );
/**
* Filters the permalink structure for a post before token replacement occurs.
*
* Only applies to posts with post_type of 'post'.
*
* @since 3.0.0
*
* @param string $permalink The site's permalink structure.
* @param WP_Post $post The post in question.
* @param bool $leavename Whether to keep the post name.
*/
$permalink = apply_filters( 'pre_post_link', $permalink, $post, $leavename );
if (
$permalink &&
! wp_force_plain_post_permalink( $post )
) {
$category = '';
if ( str_contains( $permalink, '%category%' ) ) {
$cats = get_the_category( $post->ID );
if ( $cats ) {
$cats = wp_list_sort(
$cats,
array(
'term_id' => 'ASC',
)
);
/**
* Filters the category that gets used in the %category% permalink token.
*
* @since 3.5.0
*
* @param WP_Term $cat The category to use in the permalink.
* @param array $cats Array of all categories (WP_Term objects) associated with the post.
* @param WP_Post $post The post in question.
*/
$category_object = apply_filters( 'post_link_category', $cats[0], $cats, $post );
$category_object = get_term( $category_object, 'category' );
$category = $category_object->slug;
if ( $category_object->parent ) {
$category = get_category_parents( $category_object->parent, false, '/', true ) . $category;
}
}
/*
* Show default category in permalinks,
* without having to assign it explicitly.
*/
if ( empty( $category ) ) {
$default_category = get_term( get_option( 'default_category' ), 'category' );
if ( $default_category && ! is_wp_error( $default_category ) ) {
$category = $default_category->slug;
}
}
}
$author = '';
if ( str_contains( $permalink, '%author%' ) ) {
$authordata = get_userdata( $post->post_author );
$author = $authordata->user_nicename;
}
/*
* This is not an API call because the permalink is based on the stored post_date value,
* which should be parsed as local time regardless of the default PHP timezone.
*/
$date = explode( ' ', str_replace( array( '-', ':' ), ' ', $post->post_date ) );
$rewritereplace = array(
$date[0],
$date[1],
$date[2],
$date[3],
$date[4],
$date[5],
$post->post_name,
$post->ID,
$category,
$author,
$post->post_name,
);
$permalink = home_url( str_replace( $rewritecode, $rewritereplace, $permalink ) );
$permalink = user_trailingslashit( $permalink, 'single' );
} else { // If they're not using the fancy permalink option.
$permalink = home_url( '?p=' . $post->ID );
}
/**
* Filters the permalink for a post.
*
* Only applies to posts with post_type of 'post'.
*
* @since 1.5.0
*
* @param string $permalink The post's permalink.
* @param WP_Post $post The post in question.
* @param bool $leavename Whether to keep the post name.
*/
return apply_filters( 'post_link', $permalink, $post, $leavename );
}
Related Functions