Wie mache ich einen Entwurf für jeden zugänglich?


13

Ich habe mehrere unveröffentlichte Posts auf meiner Wordpress-Website und versuche, sie mit den normalen Post-Slugs ( site.com/post-here) für normale Benutzer (die nicht angemeldet sind) zugänglich zu machen . Ich verstehe, dass dies möglicherweise nicht die beste Vorgehensweise ist, aber für meinen speziellen Zweck muss dies getan werden.

Ich habe versucht, den folgenden Codeausschnitt zu meiner functions.phpDatei hinzuzufügen :

function enable_view_drafts() {
$role = get_role( 'subscriber' ); 
$role->add_cap( 'read_private_posts' ); 
$role->add_cap( 'edit_posts' );
}
add_action( 'after_setup_theme', 'enable_view_drafts');

Ich habe initstattdessen auch Haken ausprobiert after_setup_theme. Kein Glück.

Nach meinem Verständnis werden Änderungen an Rollen in der Datenbank gespeichert und müssen daher nur einmal ausgeführt werden. Deshalb benutze ich after_setup_themeHook, um die Funktion aufzurufen.

Wenn ich jedoch versuche, als normaler Benutzer auf die Seite zuzugreifen, wird mir eine 404-Seite angezeigt, anstatt den Inhalt des Beitrags. Ich habe auch versucht, die Vorschau-URL ( site.com/?p=212&preview=true) zu laden, aber das hat auch nicht funktioniert.

Das sind meine Vermutungen:

  • Der normale Benutzer hat nicht genug Zeit caps, um den Entwurfspost zu lesen.
  • Das Testen und Anzeigen von Entwurfsposten im Front-End ist für Benutzer (einschließlich Administratoren) nicht möglich.

Welche Änderungen muss ich vornehmen, um das zu erreichen, was ich versuche? Wenn es nicht möglich ist, welche alternativen Lösungen schlagen Sie vor?

Hinweis: Ich suche keine Plugin-basierten Lösungen.


2
Ich denke, dass es hier ein bisschen Verwirrung gibt. Wenn jemand in, er nicht angemeldet ist / sie ist nicht ein Benutzer, so dass er / sie hat nicht alle Kappen. Die Abonnenten sind Benutzer, daher müssen sie registriert sein und das Login als Abonnenten anerkennen. Sie können niemandem Funktionen zuweisen, der nicht angemeldet ist. Wenn Sie möchten, dass jemand nicht angemeldet ist, können Sie Ihre Beiträge anzeigen, die sich einfach nicht von veröffentlichten Beiträgen unterscheiden. Also, warum nicht veröffentlichen? Oder möchten Sie Abonnenten Entwürfe zeigen (als Abonnenten angemeldet)?
gmazzap

@GM: Ich versuche, unveröffentlichte Posts allen zugänglich zu machen, die den direkten Permalink zu dem Post kennen. Es mag seltsam erscheinen, aber ich brauche das für ein Projekt. Wie ich in meiner Frage erwähnt habe, können Sie, falls dies nicht möglich ist, andere Umgehungsmöglichkeiten vorschlagen (falls Sie eine kennen, natürlich)?
Amal Murali

@GM: Kennst du ein Plugin, das das macht?
Amal Murali

Hast du die Antwort unten mit 3 positiven Stimmen gelesen? Es erklärt, wie es geht und am Ende der Antwort finden Sie einen Link, um ein voll funktionsfähiges Plugin von github herunterzuladen.
gmazzap

2
Für spätere Leser: Es gibt dieses Plugin von Dominik Schilling auf GitHub.
Kaiser

Antworten:


12

Sie können unbekannten Benutzern keine Funktionen zuweisen. Wenn Sie einen Beitrag für alle sichtbar machen möchten, erstellen Sie eine separate URL für diese Beiträge und fügen Sie dem Beitragseditor ein Steuerelement hinzu, um die Vorschau nur für ausgewählte Beiträge zu aktivieren.
Wenn eine solche URL aufgerufen wird, prüfen Sie, ob eine Vorschau für den Beitrag zulässig ist und ob der Beitrag noch nicht veröffentlicht wurde. Stellen Sie außerdem sicher, dass Suchmaschinen diese URL ignorieren.

Für die URL würde ich einen Endpunkt verwenden :

add_rewrite_endpoint( 'post-preview', EP_ROOT );

Jetzt können Sie URLs erstellen wie ...

http://example.com/post-preview/123

… Wo 123ist die Post-ID.

Verwenden Sie anschließend einen Callback-Handler, um die Post-ID zu überprüfen, zu überprüfen, ob sie gültig ist, und die Hauptabfrage zu überschreiben. Dies ist wahrscheinlich der einzig akzeptable Anwendungsfall für query_posts(). :)

Angenommen, der Endpunkt ist eine Klasse T5_Endpoint (ein Modell), und der Ausgabehandler ist eine Klasse T5_Render_Endpoint(eine Ansicht), mit der das Modell früher übergeben wird. Dann gibt es wahrscheinlich eine Methode, die render()aufgerufen wird template_redirect:

public function render()
{
    $post_id = $this->endpoint->get_value();

    if ( ! $post_id )
        return;

    if ( 1 !== $this->meta->get_value( $post_id )
        or 'publish' === get_post_status( $post_id )
        )
    {
        wp_redirect( get_permalink( $post_id ) );
        exit;
    }

    $query = array (
        'suppress_filters' => TRUE,
        'p'                => $post_id,
        'post_type'        => 'any'
    );

    query_posts( $query );

    add_action( 'wp_head', 'wp_no_robots' );
}

$this->metaist ein weiteres Modell (eine Klasse T5_Post_Meta) für den Post-Meta-Wert, das steuert, ob eine Vorschau zulässig ist. Das Steuerelement wird in die Veröffentlichung festgelegt Feld ( Aktionpost_submitbox_misc_actions ) gesetzt, das von einer anderen Ansicht gerendert wird, die dieselbe Metaklasse erhält.

Bildschirmfoto

So T5_Post_Meta , wo und wann der Meta-Wert gespeichert werden soll, machen die Views etwas damit.
Auch Haken intransition_post_status das Post Meta - Feld zu löschen , wenn der Beitrag veröffentlicht wird. Wir wollen keine Ressourcen verschwenden, oder?

Dies ist nur eine Übersicht. Es gibt viele Details zu behandeln ... Ich habe ein kleines Plugin geschrieben, das zeigt, wie dies implementiert wird: T5 Public Preview .


Ich danke dir sehr. Ich habe mein Ziel mit ein paar Verbesserungen erreicht. Genial. : D
Amal Murali

6

Ich habe dieses Problem auf eine meiner Meinung nach einfachere Art und Weise gelöst als @ toschos obige Antwort.

In meinem Anwendungsfall verwende ich dieselbe Datenbank für eine interne Intranet-Staging-Site und eine öffentlich zugängliche Site. Der Workflow besteht darin, dass Autoren Entwürfe schreiben und diese vor der Veröffentlichung für andere Benutzer freigeben, die diese Entwürfe auf der Intranet-Site anzeigen. Ich wollte speziell nicht, dass sich Prüfer anmelden, um Entwürfe zu sehen, also bin ich nur auf eine Konstante ENV_PRODUCTIONangewiesen , die in der wp-config-Datei basierend auf dem Hostnamen in festgelegt ist $_SERVER['SERVER_NAME']. Das ist, was die Schecks für ENV_PRODUCTIONhier tun; Schließen Sie einfach alle diese Filter kurz, wenn die Produktionsstätte angezeigt wird.

Dies ist etwas seltsam, da Sie sich erst einhängen müssen, nachdem WP_Query alle Posts aus dem Array $ wp_query-> posts entfernt hat, aber es scheint für mich stabil und sicher zu sein.

/*
 * On staging site home and archives, drafts should be visible.
 */
function show_drafts_in_staging_archives( $query ) {
    if ( ENV_PRODUCTION )
        return;

    if ( is_admin() || is_feed() )
        return;

    $query->set( 'post_status', array( 'publish', 'draft' ) );
}

add_action( 'pre_get_posts', 'show_drafts_in_staging_archives' );


/*
 * Make drafts visible on staging site single views.
 *
 * (Because on single views, WP_Query goes through logic to make sure the 
 * current user can edit the post before displaying a draft.)
 */
function show_single_drafts_on_staging( $posts, $wp_query ) {
    if ( ENV_PRODUCTION )
        return $posts;

    //making sure the post is a preview to avoid showing published private posts
    if ( ! is_preview() )        
        return $posts;

    if ( count( $posts ) )
        return $posts;

    if ( !empty( $wp_query->query['p'] ) ) {
        return array ( get_post( $wp_query->query['p'] ) );
    }
}

add_filter( 'the_posts', 'show_single_drafts_on_staging', 10, 2 );

Die Filter bestehen aus zwei Teilen.

  • Ein Filter im Hook "pre_get_posts" setzt den Standardwert für post_status auf "Publizieren, Entwurf" auf der Staging-Site. Dies gibt die Entwürfe der Posts in den Archivlisten zurück.
  • Für einzelne Ansichten ist ein separater Filter erforderlich, da die WP_Query-Klasse einige unangenehme Logik enthält, um Entwurfspost aus den Abfrageergebnissen zu entfernen, es sei denn, der aktuelle Benutzer kann sie bearbeiten. Ich habe das umgangen, indem ich 'the_posts' gefiltert und den gewünschten Beitrag direkt wieder zu den Ergebnissen hinzugefügt habe.

2
Das ist unglaublich , vielen Dank, dass Sie dies geteilt haben. Absolut perfekt und genau das, was ich brauchte.
Christian Varga

Wo füge ich diesen Code ein? (welche Datei (en)?)
Joelio

@Joelio Kannst du genau sagen, welches Problem du löst? Als einfachen Ansatz habe ich einfach diesen Code zu meiner functions.php hinzugefügt und meiner wp-config.php eine einfache Definition hinzugefügt, die die ENV_PRODUCTION-Konstante abhängig von der Anforderungsdomäne auf true oder false setzt.
Goldenapples

@goldenapples Ich habe diesen Code zu meiner function.php hinzugefügt. Was soll ich zu wp-config hinzufügen? Vielen Dank für Ihre Hilfe
Graham Slick

@MatthiasGrahamSlick - Sie brauchen nur etwas, das die ENV_PRODUCTIONKonstante festlegt, wenn Sie in Produktion sind. Ich habe domain.com für die Produktion und staging.domain.com für die Inszenierung verwendet define( 'ENV_PRODUCTION', false === stripos( $_SERVER['HTTP_HOST'], 'staging' ) );.
Goldenapples

0

Ich denke, das Plugin "User Role Editor", das auf der Website von WordPress.org verfügbar ist, könnte das sein, wonach Sie suchen. Warum möchten Sie übrigens allen Zugriff auf Ihre Entwürfe gewähren? Ich persönlich kann mir keinen Fall vorstellen, in dem dies erforderlich wäre.


Nein, wie in der Frage erwähnt, suche ich keine Plugin-basierten Lösungen. Der Verwendungszweck ist etwas kompliziert, aber ich bin mir sicher, dass dies die beste Lösung für diese spezielle Aufgabe ist, die ich ausführen möchte . :-)
Amal Murali

Ich bin auch verwirrt über den Grund. Wenn Sie möchten, dass jeder den Beitrag sieht, warum nicht einfach den Beitrag veröffentlichen? Sie können benutzerdefinierte Felder im Beitrag verwenden, um einen bestimmten Status zu verfolgen, den Sie möglicherweise definieren möchten.
KenB

Ich lasse Benutzer den Inhalt sehen, möchte aber aus einem bestimmten Grund nicht, dass die Beiträge veröffentlicht werden.
Amal Murali

0

Sie können einfach die Sichtbarkeit auf der Seite / im Beitrag auf "Privat" ändern, was nur für Redakteure und Administratoren sichtbar ist und nicht für öffentliche Besucher, Suchmaschinen, RSS-Feeds usw.


0

Ich denke, GMs Kommentar ist der beste hier. Ich gehe davon aus, dass Sie Folgendes versuchen:

  1. Schreibe einen Beitrag
  2. Als Entwurf speichern
  3. Externen (nicht angemeldeten) Benutzern erlauben, den Entwurf zur Genehmigung anzuzeigen
  4. Veröffentlichen

Ist das korrekt?

Leider kann ich mir keine einfache Möglichkeit vorstellen, dies zu tun. Sie können es als privaten Beitrag veröffentlichen, sodass die Benutzer ein Kennwort eingeben müssen, um es anzuzeigen. Sie müssen jedoch dafür angemeldet sein. Sie könnten es auch mit einem Passwort schützen, aber es wird trotzdem in Ihrem Feed und in der Liste der letzten Beiträge usw. angezeigt. Können Sie kein Gastbenutzerkonto erstellen und ihnen den Benutzernamen / das Passwort geben, wenn Sie ihnen die URL geben?

Lesen Sie hier für weitere Informationen: http://codex.wordpress.org/Content_Visibility

Alternativ gibt es ein Plugin, das möglicherweise Ihren Anforderungen entspricht: http://wordpress.org/extend/plugins/shareadraft/ Ich habe mir den Code angesehen und es sieht so aus, als würde der Entwickler den von get_post_status zurückgegebenen Wert ändern, als ob Sie es wären in der Lage, damit herumzuspielen:

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

HTH


0

Wenn es Ihnen egal ist, ob der Beitrag "veröffentlicht" ist oder nicht, möchten Sie einfach, dass er unter der regulären veröffentlichten URL für jedermann zugänglich ist und nicht auf der Hauptseite / den Suchergebnissen / RSS-Feeds usw. angezeigt wird, hat dieses Plugin mit WP 4.6 funktioniert. Mit 1 können Sie genau festlegen, wo ein Beitrag angezeigt wird:

https://wordpress.org/plugins/wp-hide-post/

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.