Home > Enterprise >  how to change edit url with "Id" to edit url with "Slug" in Wordpress
how to change edit url with "Id" to edit url with "Slug" in Wordpress

Time:10-04

I have this is WordPress Post editing Url:

https://example.com/wp-admin/post.php?post=ID&action=edit

and I want to change it to Slug Not the ID Like This:

https://example.com/wp-admin/post.php?post=Slug&action=edit

I was trying to edit the post with this Url but is not working:

https://example.com/wp-admin/post.php?post=MyPostSlug&action=edit

CodePudding user response:

In order to change the edit post link structure, you can use the get_edit_post_link filter like so:

add_filter( 'get_edit_post_link', 'so_73914075_get_edit_post_link', 10, 3);
function so_73914075_get_edit_post_link($link, $post_id, $context) {
    $post = get_post( $post_id );

    if ( ! in_array( $post->post_type, array( 'post', 'page' ) ) ) {
        return $link;
    }

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

    if ( 'revision' === $post->post_type ) {
        $action = '';
    } elseif ( 'display' === $context ) {
        $action = '&action=edit';
    } else {
        $action = '&action=edit';
    }

    if ( 'display' === $context ) {
        $post_type = '&post-type=' . $post->post_type;
    } else {
        $post_type = '&post-type=' . $post->post_type;
    }

    $custom_edit_link = str_replace( '?post=%d', '?post-name=%s', $post_type_object->_edit_link );

    return admin_url( sprintf( $custom_edit_link . $action . $post_type, $post->post_name ) );
}

This will change the edit links for regular posts and pages to something like this:

https://example.com/wp-admin/post.php?post-name=the-post-slug&action=edit&post-type=post

WARNING: make sure you limit this to only the post types you need to change the URL for. Making this change global will almost surely have unintended effects over other plugins

However, making the admin panel actually load the edit screen is not that easy.

Looking at the source code of the wp-admin/post.php file, you will see that there is no way to hook into the flow and populate the $post_id variable with the post id matching the slug you are sending through.

That means you have 2 options:

  1. RECOMMENDED Update the edit link to whatever format you want and then create an admin redirect function that pulls the slug from the initial URL and redirects to the actual edit page with the ?post=%d in it.
  2. NOT RECOMMENDED Create a new admin edit page that will understand your URL structure and include the wp-admin/post.php after the code that pulls the $post_id based on the slug.

The 2nd method might come with lots of extra code you need to write to cover all the cases and all the instances a post reaches the post.php in the admin panel

  • Related