web-dev-qa-db-ja.com

投稿が非公開かどうかを確認するにはどうすればよいですか。

私がやろうとしているのは、ページが非公開かどうかを確認し、ユーザーにそのページを登録して表示するオプションを提供することです。これが私が今持っているものです:

<?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; ?>

私の問題は、ページが存在しなくても、常にログインボックスにアクセスして表示されることです。これをどのように修正しますか?

2
hornj

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
7
userabuser