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?
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();
}
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. :)