私がやろうとしているのは、ページが非公開かどうかを確認し、ユーザーにそのページを登録して表示するオプションを提供することです。これが私が今持っているものです:
<?php
if (have_posts()) :
/* Print the most as normal */
else :
if ($post->post_status = 'private')
{
/* Print login/register box */
}
else
{
/* Print page not found message */
}
endif; ?>
私の問題は、ページが存在しなくても、常にログインボックスにアクセスして表示されることです。これをどのように修正しますか?
POSTがprivateに設定されている場合、ログインしていないユーザーは404メッセージを受け取ります。グローバル変数$wp_query
をダンプすると、
var_dump($wp_query);
..あなたは、返されるパラメータにpost_status
が存在しないことに気付くでしょう。そのため、slug(例えばquery_vars
配列のname
パラメータ)を使って、アクセスしようとしているPOSTの投稿ステータスを取得できます
global $wp_query;
$slug = $wp_query->query_vars['name'];
$status = get_page_by_path($slug, OBJECT, 'post');
if ($status->post_status == "private") {
//show form
} else {
//etc...
}
コーデックスの参考資料:
http://codex.wordpress.org/Function_Reference/get_page_by_path
"PAGE"投稿タイプに対して(コメントに従って)このアクションを実行しようとしていることに基づいて、上記のコードはget_page_by_path()
内で'post'
を'page'
に変更する必要があります。
$wp_query->query_vars['name'];
を使用してもまだ動作しなかったのは、あなたのページが別のページのCHILDページであるという事実に関係しています。言い換えれば、それは親を持っています。
私たちが使用している関数はそのパスでページを取得しているので、親ページが重要になるようにフルパスを知る必要があります。したがって、私たちは変えなければなりません、
$slug = $wp_query->query_vars['name'];
に
$slug = $wp_query->query['pagename']; //which will show the full path e.g. parent/child
さらに詳しく説明すると、$wp_query
内の別の配列からフルパスにアクセスすることです。これは、$wp_query
が実際に結果をダンプするときの構成の例(サンプルスニペット)です。
["query"]=> //we are now accessing the ["query"] array instead of ["query_vars"]
array(2) {
["page"]=>
string(0) ""
["pagename"]=> //and this is what need, notice the full path
string(20) "sample-page/sub-page"
}
["query_vars"]=>
array(57) {
["page"]=>
int(0)
["pagename"]=> //this is what we don't need, no full path contained, will not work
string(8) "sub-page"
etc.......
したがって、変更されたコード全体は次のようになります。
global $wp_query;
$slug = $wp_query->query['pagename']; //from ->query_vars to ->query
$status = get_page_by_path($slug, OBJECT, 'page'); //change to meet your desired post_type
if ($status->post_status == "private") {
//show form
} else {
//etc...
}
Kaiserが述べたように、投稿ステータスを取得するためにget_post_status()
関数を使うこともできます。
if (get_post_status($status->ID) == "private") ... etc