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