wake-up-neo.com

Wie überprüfe ich, ob ein Beitrag privat ist?

Ich möchte überprüfen, ob eine Seite privat ist, und den Benutzern die Möglichkeit geben, sich zu registrieren und die Seite anzuzeigen. Folgendes habe ich jetzt:

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

Mein Problem ist, dass es immer durchsetzt und das Anmeldefeld anzeigt, auch wenn die Seite nicht existiert. Wie behebe ich das?

2
hornj

Wenn ein POST auf privat gesetzt ist, erhalten nicht angemeldete Benutzer eine 404-Nachricht. Wenn Sie die globale Variable $wp_query sichern,

var_dump($wp_query);

..sie werden feststellen, dass in den zurückgegebenen Parametern kein post_status vorhanden ist, daher können Sie mithilfe des Slugs (oder des Parameters name des Arrays query_vars) den Post-Status des POST ermitteln, auf den zugegriffen werden soll so,

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

}

Hilfreiche Codex-Ressourcen:

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

Aktualisieren:

Auf der Grundlage, dass Sie versuchen, diese Aktion für den Post-Typ "PAGE" auszuführen (gemäß Ihren Kommentaren), sollte der obige Code 'post' in 'page' entsprechend in get_page_by_path() ändern.

Der Grund, warum es bei der Verwendung von $wp_query->query_vars['name']; immer noch nicht funktioniert hat, hängt mit der Tatsache zusammen, dass Ihre Seite eine KIND-Seite einer anderen Seite ist, mit anderen Worten, sie hat ein PARENT.

Da die von uns verwendete Funktion unsere Seite anhand ihres Pfades ermittelt, muss ihr vollständiger Pfad bekannt sein, damit die übergeordnete Seite eine Rolle spielt. Deshalb müssen wir uns ändern,

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

zu

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

Wir arbeiten weiter daran, dass wir von einem anderen Array im $wp_query auf den vollständigen Pfad zugreifen. In diesem Beispiel (Beispielausschnitt) wird gezeigt, was $wp_query ist, wenn die Ergebnisse ausgegeben werden

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

Daher sieht der vollständig geänderte Code folgendermaßen aus:

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

}

Wie Kaiser bereits erwähnt hat, können Sie auch die Funktion get_post_status() verwenden, um den Post-Status abzurufen.

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