Retrieves the edit post link for post.
Description
Can be used within the WordPress loop or outside of it. Can be used with pages, posts, attachments, revisions, global styles, templates, and template parts.
Parameters
$postint|WP_Postoptional- Post ID or post object. Default is the global
$post. $contextstringoptional- How to output the
'&'character. Default'&'.Default:
'display'
Source
function get_edit_post_link( $post = 0, $context = 'display' ) {
$post = get_post( $post );
if ( ! $post ) {
return;
}
if ( 'revision' === $post->post_type ) {
$action = '';
} elseif ( 'display' === $context ) {
$action = '&action=edit';
} else {
$action = '&action=edit';
}
$post_type_object = get_post_type_object( $post->post_type );
if ( ! $post_type_object ) {
return;
}
if ( ! current_user_can( 'edit_post', $post->ID ) ) {
return;
}
$link = '';
if ( 'wp_template' === $post->post_type || 'wp_template_part' === $post->post_type ) {
$slug = urlencode( get_stylesheet() . '//' . $post->post_name );
$link = admin_url( sprintf( $post_type_object->_edit_link, $post->post_type, $slug ) );
} elseif ( 'wp_navigation' === $post->post_type ) {
$link = admin_url( sprintf( $post_type_object->_edit_link, (string) $post->ID ) );
} elseif ( $post_type_object->_edit_link ) {
$link = admin_url( sprintf( $post_type_object->_edit_link . $action, $post->ID ) );
}
/**
* Filters the post edit link.
*
* @since 2.3.0
*
* @param string $link The edit link.
* @param int $post_id Post ID.
* @param string $context The link context. If set to 'display' then ampersands
* are encoded.
*/
return apply_filters( 'get_edit_post_link', $link, $post->ID, $context );
}
Hooks
- apply_filters( ‘get_edit_post_link’,
string $link ,int $post_id ,string $context ) Filters the post edit link.
These docs are confusing about the second parameter.
$contextdefaults to “display”, which means the ampersand is encoded with&action=edit. If you pass any other value (doesn’t matter what), the ampersond is not encoded, so the return value is&action=editThe default output is not ‘&’ for the second parameter. It’s actually ‘&’, this can cause issues depending on your environment when used directly in the browser.
Anything else than ‘display’ in the $context param will display the correct symbol instead of the HTML entity for it.