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.php
Datei 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 init
stattdessen 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_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 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.
quelle
Antworten:
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 :
Jetzt können Sie URLs erstellen wie ...
… Wo
123
ist 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 KlasseT5_Render_Endpoint
(eine Ansicht), mit der das Modell früher übergeben wird. Dann gibt es wahrscheinlich eine Methode, dierender()
aufgerufen wirdtemplate_redirect
:$this->meta
ist ein weiteres Modell (eine KlasseT5_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.So
T5_Post_Meta
, wo und wann der Meta-Wert gespeichert werden soll, machen die Views etwas damit.Auch Haken in
transition_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 .
quelle
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_PRODUCTION
angewiesen , die in der wp-config-Datei basierend auf dem Hostnamen in festgelegt ist$_SERVER['SERVER_NAME']
. Das ist, was die Schecks fürENV_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.
Die Filter bestehen aus zwei Teilen.
quelle
ENV_PRODUCTION
Konstante festlegt, wenn Sie in Produktion sind. Ich habe domain.com für die Produktion und staging.domain.com für die Inszenierung verwendetdefine( 'ENV_PRODUCTION', false === stripos( $_SERVER['HTTP_HOST'], 'staging' ) );
.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.
quelle
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.
quelle
Ich denke, GMs Kommentar ist der beste hier. Ich gehe davon aus, dass Sie Folgendes versuchen:
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
quelle
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/
quelle