web-dev-qa-db-ja.com

スケジュールされた投稿のプレビューを誰にでも見えるようにするには?

投稿を書いて後で公開するようにスケジュールすると、WordPressはその投稿を既に公開されているかのようにプレビューできますが、管理者(または投稿をプレビューする権限のあるユーザー)としてログインする必要があります。

誰か、つまり匿名ユーザーによっても投稿をプレビュー可能にする方法、おそらくクエリ文字列パラメータはありますか? my-post?previewsecret=645732116468のようなものですか?

2
Borek Bernard

ドラフトプレビュー

query.phpの中のこのコアコードの塊をちょっと見てください。

投稿を表示するかどうかを決定するために投稿ステータスを[チェック]します。

http://core.trac.wordpress.org/browser/tags/3.3.1/wp-includes/query.php#L2658

if ( ! is_user_logged_in() ) {
  // User must be logged in to view unpublished posts.
  $this->posts = array();
}

これは、ログインしていないユーザーを迂回することをやや非直接的にするものです。その関数の結果をオーバーライドするには、 より深く 移動してから役割を引き受けます。しかし、それはあまりにも多くのオーバーヘッドであり、公開されたセキュリティに貢献することができます。

もう少し調べてみると http://core.trac.wordpress.org/browser/tags/3.3.1/wp-includes/query.php#L2632 2632行目で、投稿は実際にデータベースから取得され、数行下のposts_resultsフックを使用してさらにフィルタリングできることがわかります。

Postの値を格納し、posts配列を無効にするすべてのチェックの後に最後の方にそれを注入します。 http://core.trac.wordpress.org/browser/tags/3.3.1/wp-includes/query.php#L2740 where the_posts hook熱心に待っています。

それで大まかな何かはこんな感じになるでしょう:

add_filter( 'posts_results', 'wpse46014_peek_into_private', null, 2 );
function wpse46014_peek_into_private( $posts, &$query ) {

    if ( sizeof( $posts ) != 1 ) return $posts; /* not interested */

    $status = get_post_status( $posts[0] );
    $post_status_obj = get_post_status_object( $status );

    if ( $post_status_obj->public ) return $posts; /* it's public */

    if ( !isset( $_GET['key'] ) || $_GET['key'] != 'foryoureyesonly' )
        return $posts; /* not for your eyes */

    $query->_my_private_stash = $posts; /* stash away */

    add_filter( 'the_posts', 'wpse46014_inject_private', null, 2 );
}

function wpse46014_inject_private( $posts, &$query ) {
    /* do only once */
    remove_filter( 'the_posts', 'wpse46014_inject_private', null, 2 );
    return $query->_my_private_stash;
}

あなたの投稿プレビューリンクに秘密鍵?p=4601&key=foryoureyesonlyを追加すると、その投稿はだれにでも表示されます。このコードには、stashのような汚い問題がいくつかあります。代わりにglobalsを使用するか(推奨しません)、オブジェクトにまとめて(yes!)、投稿ごとにカスタムパスワードを使用して機能をさらに拡張できます。

スケジュールされたプレビュー

スケジュールされたプレビューは非常によく似た方法で機能します。 posts_resultsには、'future'ステータス投稿がまったく同じ方法で入力されており、同じフックを活用できます。スケジュールされた投稿では、コードは変更されずに機能します。

/2012/07/12/one-two-three/ - 404 NOT FOUND

/2012/07/12/one-two-three/?key=foryoureyesonly - 200 OK

7
soulseekah

Soulseekahの答えは信じられないほどのもので、私が探していたものそのものです。これを検索する際に、私はまたプラグインに出会いました(それは私が知っているすべてのためにこの投稿に基づいているかもしれない)。

公開投稿プレビュー

1
hookedonwinter