5

When I use the_permalink or get_the_permalink in a draft or scheduled post, the URL provided is not the "final" permalink—it is the unpretty ?p=xxxxx version.

How can I get the final, "clean" permalink to show up in a draft or scheduled post?

I could do something involving $post->post_name, but I'd need the path as well, and that varies from post type to post type and depends on permalink structure. Is there a "universal" way to do this?

  • Why would you need the pretty permalink for drafts? – sanchothefat Feb 8 '12 at 14:49
  • 2
    @sanchothefat Among other things, I generate a PDF (containing the post's permalink), before publishing. Now the only way I can do that on an unpublished post is with static text. – supertrue Feb 8 '12 at 19:18
5

This is a little "hacky", but when you call get_permalink and you need the permalink for a draft, provide a clone of your post object with the details filled in:

global $post;
if ( in_array( $post->post_status, array( 'draft', 'pending', 'auto-draft' ) ) ) {
    $my_post = clone $post;
    $my_post->post_status = 'publish';
    $my_post->post_name = sanitize_title(
        $my_post->post_name ? $my_post->post_name : $my_post->post_title,
        $my_post->ID
    );
    $permalink = get_permalink( $my_post );
} else {
    $permalink = get_permalink();
}
7

Since editor displays projected permalink for slug editor, it must have some way to figure it out. From looking at source that is handled by get_sample_permalink_html() and get_sample_permalink().

Since we only need link without form cruft, we can rework it into something like:

function get_draft_permalink( $post_id ) {

    require_once ABSPATH . '/wp-admin/includes/post.php';
    list( $permalink, $postname ) = get_sample_permalink( $post_id );

    return str_replace( '%postname%', $postname, $permalink );
}

No confidence it is foolproof, but works fine from quick test. :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.