Wordpress - Rewriting post slug before post save

The following is to be taken more as a proof of concept rather than a copy/paste-ready solution.
That being said, this is how you'd go about it:

The save_post action runs whenever a post is updated or created. You can hook a callback function to it using add_action.

Hence, your case would have to look something like this:

// initial hook
add_action( 'save_post', 'wpse105926_save_post_callback' );

function wpse105926_save_post_callback( $post_id ) {

    // verify post is not a revision
    if ( ! wp_is_post_revision( $post_id ) ) {

        // unhook this function to prevent infinite looping
        remove_action( 'save_post', 'wpse105926_save_post_callback' );

        // update the post slug
        wp_update_post( array(
            'ID' => $post_id,
            'post_name' => 'some-new-slug' // do your thing here
        ));

        // re-hook this function
        add_action( 'save_post', 'wpse105926_save_post_callback' );

    }
}

What might be a bit confusing in the above is the un- and rehooking of the function from within it. This is required, since we call wp_update_post to update the slug, which in turn will trigger the save_post action to run again.

As an aside, if you want WP to automatically generate the new slug based on the post title, simply pass an empty string:

wp_update_post( array(
    'ID' => $post_id,
    'post_name' => '' // slug will be generated by WP based on post title
));

I needed the same except that only for post creation.

I implemented the solution here (this one is copy/paste-ready ).

Just remove the line which checks that both dates are equal, and it will update the slug for edit operations too. However, I do not recommend that since it will change the URL of the post and this is not good for SEO, among other things like broken links (404).

Tags:

Posts