it-swarm.com.de

Wie mache ich einen Entwurf eines Beitrags für alle verfügbaren?

Ich habe mehrere unveröffentlichte Posts auf meiner Wordpress-Website und ich 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 in meine functions.php-Datei einzufü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 auch versucht, init hook anstelle von after_setup_theme. Kein Glück.

Meines Wissens nach werden Änderungen an Rollen in der Datenbank gespeichert und müssen daher nur einmal durchgeführt werden. Deshalb benutze ich after_setup_theme hook, 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 Posts anzuzeigen. Ich habe auch versucht, die Vorschau-URL (site.com/?p=212&preview=true) zu laden, aber das hat auch nicht funktioniert.

Dies sind meine Vermutungen:

  • der normale Benutzer hat nicht genug 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 bin nicht auf der Suche nach Plugin-basierten Lösungen.

12
Amal Murali

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, überprü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

… Wobei 123 die Post-ID ist.

Verwenden Sie dann 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 einzige 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 render(), die auf template_redirect aufgerufen wird:

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->meta ist ein anderes Modell (Klasse T5_Post_Meta) für den Post-Meta-Wert, das steuert, ob eine Vorschau zulässig ist. Das Steuerelement wird in das Feld Publish ( action post_submitbox_misc_actions ) gesetzt, das von einer anderen Ansicht gerendert wird, die dieselbe Metaklasse erhält.

screen shot

T5_Post_Meta weiß also, wo und wann der Meta-Wert gespeichert werden muss, und die Views tun etwas damit.
Außerdem in transition_post_status einbinden , um das Post-Metafeld zu löschen, wenn der Post veröffentlicht wird. Wir wollen doch 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 .

12
fuxia

Ich habe dieses Problem auf eine meiner Meinung nach einfachere 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. Ich bin also nur auf die Konstante ENV_PRODUCTION angewiesen, die in der Datei wp-config basierend auf dem Hostnamen in $_SERVER['SERVER_NAME'] festgelegt ist. Das ist, was die Überprüfungen für ENV_PRODUCTION hier 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. Dadurch werden die Entwürfe von Posts in Archivlisten zurückgegeben.
  • 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 gleich wieder zu den Ergebnissen hinzugefügt habe.
5
goldenapples

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.

0
Georgi Demirev

Wenn es Ihnen egal ist, ob der Beitrag "veröffentlicht" ist oder nicht, möchten Sie, dass er nur 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.1 und ermöglicht Ihnen die Feinabstimmung, wo ein Beitrag angezeigt wird:

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

0
Sarah Northway

Ich denke, G.M.'s 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 dann weiterhin in Ihrem Feed und in der Liste der letzten Beiträge usw. angezeigt. Könnten 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 Ihren Anforderungen entsprechen könnte: 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 Sie könnten also in der Lage sein, damit herumzuspielen:

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

HTH

0
TomC

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
NickJAB