投稿を書いて後で公開するようにスケジュールすると、WordPressはその投稿を既に公開されているかのようにプレビューできますが、管理者(または投稿をプレビューする権限のあるユーザー)としてログインする必要があります。
誰か、つまり匿名ユーザーによっても投稿をプレビュー可能にする方法、おそらくクエリ文字列パラメータはありますか? my-post?previewsecret=645732116468
のようなものですか?
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
Soulseekahの答えは信じられないほどのもので、私が探していたものそのものです。これを検索する際に、私はまたプラグインに出会いました(それは私が知っているすべてのためにこの投稿に基づいているかもしれない)。