web-dev-qa-db-fra.com

Comment vérifier si un message est privé?

Ce que je cherche à faire est de vérifier si une page est privée, de donner aux utilisateurs la possibilité de s’inscrire et de voir la page. Voici ce que j'ai maintenant:

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

Mon problème est qu'il tombe toujours et affiche la boîte de connexion même lorsque la page n'existe pas. Comment puis-je réparer ça?

2
hornj

Lorsqu'un POST est défini sur privé, les utilisateurs non connectés recevront un message 404. Si vous videz la variable globale $wp_query,

var_dump($wp_query);

..vous remarquerez qu’aucun post_status n’est présent dans les paramètres retournés. Par conséquent, en utilisant le slug (ou le paramètre name de query_vars array par exemple), nous pouvons obtenir le statut de publication du POST qui tente d’être consulté, comme alors,

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

}

Ressources utiles du Codex:

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

Mettre à jour:

Si vous essayez d'exécuter cette action pour le type de message "PAGE" (conformément à vos commentaires), le code ci-dessus devrait changer 'post' en 'page' en conséquence dans get_page_by_path().

Maintenant, la raison pour laquelle elle ne fonctionnait toujours pas avec $wp_query->query_vars['name']; est alors liée au fait que votre page est une page CHILD d’une autre page. En d’autres termes, elle a un PARENT.

Comme la fonction que nous utilisons récupère notre page par son chemin, elle doit connaître son chemin complet pour que la page parente soit importante. Par conséquent, nous devons changer,

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

à

$slug = $wp_query->query['pagename']; //which will show the full path e.g. parent/child

Pour aller plus loin, nous accédons au chemin complet depuis un tableau différent dans le $wp_query. Voici un exemple (extrait de code) de ce que $wp_query contient en réalité lorsque vous exportez les résultats.

  ["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.......

Par conséquent, le code modifié dans son intégralité ressemblera à ceci:

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

}

Comme Kaiser l’a mentionné, vous pouvez également utiliser la fonction get_post_status() pour récupérer l’état de la publication.

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