it-swarm.com.de

Private Seiten, die funktionieren, wenn Sie nicht angemeldet sind WP Administrator

Mein Verständnis von privaten Posts/Seiten ist, dass sie nur funktionieren, wenn Sie als Administrator oder Redakteur beim WP Admin-System angemeldet sind.

Ich habe eine Website, auf der ich gelegentlich benutzerdefinierte Posts über Links für Benutzer freigeben muss, und ich möchte nicht, dass sie an anderer Stelle auf der Website angezeigt werden. Das Setzen von Beiträgen auf "privat" macht fast das, was ich will, da es die Beiträge sofort von der Homepage der Site und anderen Bereichen entfernt, in denen sie normalerweise enthalten wären.

Das einzige Problem ist, dass die Funktion "Privater Beitrag" davon ausgeht, dass ich den Beitrag beim Anmelden beim Administrator ansehen möchte. Dies ist jedoch nicht der Fall, da bei Nichtanmeldung eine 404-Fehlermeldung angezeigt wird. Ich möchte diesen Beitrag mit Fremden manuell als und teilen wenn ich ohne Passwort muss und sie über ihren Standard-Permalink wie gewohnt erscheinen sollen.

Dies mag ein Plugin-Gebiet sein, aber zu meiner Überraschung habe ich keines gefunden, das das kann.

Zur Verdeutlichung ist der Beitragstyp, auf dem ich dies implementieren muss, ein benutzerdefinierter Beitragstyp, der von einem Plugin definiert wird, das die Site zum Ausführen benötigt.

2
AdamJones

Wenn Sie nicht ein Plugin verwenden möchten (oder kein Plugin finden können, das das tut, was Sie benötigen), möchten Sie es möglicherweise folgendermaßen angehen:

  1. Fügen Sie ein benutzerdefiniertes Meta-Feld hinzu , mit dem Sie den Beitrag als hidden markieren können.
  2. Ändern Sie die Abfrage mit pre_get_posts , um die Beiträge zu entfernen, die Sie als von Ihrer Site ausgeblendet markiert haben (die jedoch mit einem direkten Link verfügbar sind).

UPDATE

Nach dem obigen Vorschlag ist hier eine mögliche Lösung.

Erstelle ein benutzerdefiniertes Meta-Feld

Erstellen Sie zunächst die benutzerdefinierte Meta-Box, indem Sie eine registrieren:

function yourtextdomain_add_custom_meta_box() {
  add_meta_box("demo-meta-box", "Custom Meta Box", "yourtextdomain_custom_meta_box_markup", "post", "side", "high", null);
}
add_action("add_meta_boxes", "yourtextdomain_add_custom_meta_box");

Fügen Sie das Markup zur Metabox hinzu (ein Ankreuzfeld in dem Fall):

function yourtextdomain_custom_meta_box_markup($object) {
  wp_nonce_field(basename(__FILE__), "meta-box-nonce"); ?>
    <div>
      <br />
      <label for="meta-box-checkbox">Hidden</label>

      <?php $checkbox_value = get_post_meta($object->ID, "meta-box-checkbox", true);
          if($checkbox_value == "") { ?>

          <input name="meta-box-checkbox" type="checkbox" value="true">

      <?php } else if($checkbox_value == "true") { ?>

          <input name="meta-box-checkbox" type="checkbox" value="true" checked>

      <?php } ?>

      <p style="color: #cccccc"><i>When selected, the post will be removed from the WP loop but still accessible from a direct link.</i></p>
    </div>
  <?php
}

Dies gibt Ihnen eine Meta-Box für jeden Beitrag, der so aussieht:

Und schließlich speichern Sie den Meta-Box-Wert:

function yourtextdomain_save_custom_meta_box($post_id, $post, $update) {
    if (!isset($_POST["meta-box-nonce"]) || !wp_verify_nonce($_POST["meta-box-nonce"], basename(__FILE__)))
        return $post_id;

    if(!current_user_can("edit_post", $post_id))
        return $post_id;

    if(defined("DOING_AUTOSAVE") && DOING_AUTOSAVE)
        return $post_id;

    $slug = "post";

    if($slug != $post->post_type)
        return $post_id;

    $meta_box_checkbox_value = "";

    if(isset($_POST["meta-box-checkbox"])) {
      $meta_box_checkbox_value = $_POST["meta-box-checkbox"];
    }
    update_post_meta($post_id, "meta-box-checkbox", $meta_box_checkbox_value);
}
add_action("save_post", "yourtextdomain_save_custom_meta_box", 10, 3);

In der wp_postmeta-Tabelle sollte nun der Metawert 'true' angezeigt werden, der den Beiträgen zugewiesen ist, die Sie als versteckt und gespeichert markiert haben:

 Post Meta Table 

Ändern der Abfrage mit pre_get_posts

Jetzt müssen nur noch die Beiträge herausgefiltert werden, die für die Hauptabfrage als ausgeblendet markiert sind. Wir können das mit pre_get_posts machen:

add_action( 'pre_get_posts', 'yourtextdomain_pre_get_posts_hidden', 9999 );
function yourtextdomain_pre_get_posts_hidden( $query ){

  // Check if on frontend and main query.
    if( ! is_admin() && $query->is_main_query() ) {

    // For the posts we want to exclude.
    $exclude = array();

    // Locate our posts marked as hidden.
    $hidden = get_posts(array(
      'post_type' => 'post',
      'meta_query' => array(
        array(
          'key' => 'meta-box-checkbox',
          'value' => 'true',
          'compare' => '==',
        ),
      )
    ));

    // Create an array of hidden posts.
    foreach($hidden as $hide) {
      $exclude[] = $hide->ID;
    }

    // Exclude the hidden posts.
    $query->set('post__not_in', $exclude);

    }
}
4
Jami Gibbs

In WordPress Core sind private Posts wahrscheinlich die nächsten, die Sie ohne Verwendung eines Plugins erhalten können. Da Sie erwähnt haben, dass Sie Links zu privaten Posts an andere senden müssen, empfehle ich Ihnen, das Rad nicht neu zu erfinden und eines der Plugins zu verwenden, die dies tun.

Zum Beispiel kann ich sehr empfehlen Public Post Preview von WordPress Core Committer Dominik Schilling (ocean90). Ich denke, es macht genau das, was Sie wollen:

Ermöglicht es Ihnen, anonymen Benutzern einen Link zur öffentlichen Vorschau eines Beitrags zu geben, bevor dieser veröffentlicht wird.

Es erledigt für Sie alle Verknüpfungsablauf-Aufgaben, Funktionsprüfungen usw., sodass Sie sich keine Sorgen machen müssen, wenn Sie eine benutzerdefinierte Lösung verwenden, um versehentlich zu viel Inhalt freizugeben.

1
swissspidy

1) Erstellen Sie einen benutzerdefinierten Beitragstyp, der NICHT öffentlich ist (z. B. "hidden_posts").

2) Erstellen Sie eine benutzerdefinierte Vorlage in der aktuellen Vorlage und führen Sie eine benutzerdefinierte $ wpdb-Abfrage aus, wobei Sie den Parameter post_type an "hidden_posts" in der Vorlage übergeben

3) Erstellen Sie eine reguläre Seite mit der soeben erstellten Vorlage.

4) Fügen Sie die Seite in (3) zu Ihrem Robotertext hinzu und verweigern Sie den Zugriff, um sicherzustellen, dass sie nicht indiziert ist!

5) Wähle meine Antwort als die beste :)

NB: Wenn Sie einen detaillierten Code benötigen, lassen Sie es mich wissen!

0
codiiv

Sie können einen benutzerdefinierten Beitragstyp für diesen Beitragstyp festlegen, der nur für nicht angemeldete Benutzer angezeigt werden soll.

in der können Sie die single.php-Datei für Ihren benutzerdefinierten Posttyp anpassen, indem Sie sie in der custom-postype.php-Datei überschreiben. In dieser können Sie überprüfen, ob der Benutzer nicht angemeldet ist, und sie ansonsten nicht anzeigen.

Lassen Sie mich Ihre Ansichten unten durch Kommentar wissen

0
Pratik bhatt

Wahrscheinlich Plugin-Gebiet, da, wie Sie die Funktionsweise privater Seiten erwähnen, diese nur für angemeldete Benutzer auf Administrator- oder Editor-Ebene sichtbar sind.

Siehe https://codex.wordpress.org/Content_Visibility

Ihr Anwendungsfall ist nicht ganz klar, aber Sie können möglicherweise einen benutzerdefinierten Beitragstyp erstellen, der auf Indexseiten nicht sichtbar ist (setzen Sie public auf false, fügen Sie kein Archiv hinzu, usw.), also nur jemanden mit dem Permalink konnte es sehen. Jemand könnte den Permalink erraten, es wäre also nicht ganz "privat".

https://codex.wordpress.org/Function_Reference/register_post_type#Arguments

0
jetyet47