Как проверить, является ли сообщение приватным?

Я ищу, чтобы проверить, является ли страница закрытой, дать пользователям возможность зарегистрироваться и просмотреть страницу. Вот что у меня есть сейчас:

<?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 настроен на приватное, пользователи, не входящие в систему, получат сообщение 404. Если вы $wp_query глобальную переменную $wp_query ,

 var_dump($wp_query); 

.. вы заметите, что в возвращаемых параметрах нет post_status поэтому, используя slug (или параметр query_vars массива query_vars например), мы можем получить статус сообщения 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... } 

Полезные ресурсы Codex:

http://codex.wordpress.org/Function_Reference/get_page_by_path

Обновить:

Исходя из того, что вы пытаетесь выполнить это действие для типа сообщения «СТРАНИЦА» (в соответствии с вашими комментариями), вышеуказанный код должен соответственно изменить 'post' на 'page' в get_page_by_path() .

Теперь причина, по которой он все еще не работал при использовании $wp_query->query_vars['name']; затем связано с тем, что ваша страница является дочерней страницей другой страницы, другими словами у нее есть PARENT.

Поскольку функция, которую мы используем, получает нашу страницу по ее пути, она должна знать свой полный путь, так что родительская страница имеет значение. Поэтому мы должны измениться,

 $slug = $wp_query->query_vars['name']; 

в

 $slug = $wp_query->query['pagename']; //which will show the full path eg 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... } 

Как упоминал Кайзер, вы также можете использовать get_post_status() для получения статуса сообщения, и это можно сделать так,

 if (get_post_status($status->ID) == "private") ... etc