web-dev-qa-db-ja.com

ドラフトでクリーンパーマリンクを取得する方法

ドラフトまたはスケジュールされた投稿でthe_permalinkまたはget_the_permalinkを使用する場合、提供されるURLは「最終的な」パーマリンクではありません - それは未確認の?p=xxxxxバージョンです。

ドラフトまたはスケジュールされた投稿に最終的な「クリーンな」パーマリンクを表示するにはどうすればよいですか。

私は$post->post_nameを使って何かをすることができました、しかし私は同様にパスを必要とします、そしてそれは投稿の種類によって異なり、パーマリンクの構造に依存します。これを行うための「普遍的な」方法はありますか?

5
supertrue

これはちょっと「ハッキー」ですが、get_permalinkを呼び出してドラフトのパーマリンクが必要な場合は、投稿オブジェクトのクローンを詳細を記入して提供してください。

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

エディタはスラッグエディタのために投影されたパーマリンクを表示するので、それを理解するための何らかの方法を持たなければなりません。 get_sample_permalink_html()get_sample_permalink() によって扱われるソースを見ることから。

私たちはフォームの狡猾なしでリンクを必要とするだけなので、それを次のようなものに作り直すことができます。

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

それは絶対確実であるという自信はありませんが、クイックテストからうまく動作します。 :)

6
Rarst