web-dev-qa-db-fra.com

Comment obtenir le permalien propre dans un brouillon?

Lorsque j'utilise the_permalink ou get_the_permalink dans un brouillon ou une publication planifiée, l'URL fournie n'est pas le lien permanent "final" - c'est la version non désapprouvée ?p=xxxxx.

Comment puis-je obtenir le dernier permalien "propre" à afficher dans un brouillon ou un message programmé?

Je pourrais faire quelque chose impliquant $post->post_name, mais j’aurais aussi besoin du chemin, ce qui varie d’un message à l’autre et dépend de la structure de lien permanent. Existe-t-il un moyen "universel" de faire cela?

5
supertrue

C'est un peu "hacky", mais lorsque vous appelez get_permalink et que vous avez besoin du lien permanent pour un brouillon, fournissez un clone de votre objet de publication avec les détails renseignés:

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();
}
5
Matthew Boynes

Depuis que l’éditeur affiche un permalien projeté pour l’éditeur de slug, il doit avoir un moyen de le comprendre. En regardant la source qui est gérée par get_sample_permalink_html() et get_sample_permalink() .

Puisque nous n'avons besoin que de lien sans forme crueft, nous pouvons le retravailler en quelque chose comme:

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 );
}

Aucune confiance, il est infaillible, mais fonctionne très bien après un test rapide. :)

6
Rarst