web-dev-qa-db-de.com

Wie benötige ich eine Autorisierung/Anmeldung, um bestimmte Beiträge/Seiten anzuzeigen?

Ich arbeite an einer WordPress-Site für einen Kunden, der ein internes Intranet für seine Mitarbeiter haben möchte. Die Grundbedürfnisse sind:

  1. Kommunizieren Sie die Dinge im Haus
  2. Haus wichtige Unternehmensdokumente
  3. Bieten Sie Mitarbeitern schnellen Zugriff auf Ressourcen.

Diese Informationen sind vertraulich und nur für Mitarbeiter. Sie möchten, dass jeder Mitarbeiter einen Benutzernamen/ein Kennwort hat und erst nach dem Anmelden Informationen und Dokumente anzeigen kann.

Ich habe diese Plugins gesehen und ein paar davon, aber sie scheinen begrenzt zu sein, und natürlich sind sie jetzt völlig veraltet:

Ich weiß, dass ich einzelne Beiträge/Seiten durch ein Passwort schützen kann. Kann ich eine ganze Kategorie von Posts oder besser einen benutzerdefinierten Post-Typ mit einem Passwort schützen? Grundsätzlich muss ich einige Seiten/Beiträge unter einem Login zusammenfassen. Die Informationen sind vertraulich, sodass sie beispielsweise im RSS-Feed nicht verfügbar sind. Wie kann ich das machen?

  • Option 1 (weniger wünschenswert): Lassen Sie ein ganzes WordPress-Programm hinter einer Login-Wand erstellen
  • Option 2 (wünschenswerter): Nur die internen Seiten/Posts hinter der Login-Wand

Fazit: Ich interessiere mich für Option 1, wenn es einfacher ist, bevorzuge aber Option 2. Nach einigen Recherchen finde ich derzeit nur veraltete Plug-ins, die dabei helfen, und finde anscheinend keine verlässliche Weg, um eines von beiden zu ziehen. Danke für Ihre Hilfe!

3
timshutes

Es ist möglich, die entsprechenden Archivseiten und Einzelseiten zu überprüfen

Das Einzige, was Sie zusammen mit allen anderen Lösungen tun sollten, ist die Verwendung des Filters the_posts. Es filtert die Posts heraus, die WP_Query abruft. Sie erhalten eine Reihe von Post-Objekten. Überprüfen Sie den Zustand und deaktivieren Sie das Objekt, falls es vorhanden ist. Dieser ist für den Fall gedacht, dass alle anderen Lösungen umgangen werden. Dies ist der letzte Ausweg, wenn ein unbekanntes Plugin die Posts abruft, ohne dass Sie eine Ahnung davon haben.

Eine andere Sache, die Sie verwenden sollten, ist der pre_get_posts-Filter, um die Abfragevariablen zu überprüfen und sie nach Bedarf zu ändern

Ein anderer ist posts_where filter. Verwenden Sie ihn, um eine weitere where-Klausel zur mysql-Abfrage hinzuzufügen

Dies ist nicht vollständig sicher, sollte jedoch die meisten Fälle und sogar die meisten externen Plugins abdecken.

Wenn Sie einen benutzerdefinierten Beitragstyp verwenden, wird dies viel einfacher. Sie können benutzerdefinierte Funktionen für diesen post_type festlegen und diese Funktionen dann nur Benutzern einer bestimmten Rolle zuweisen.

Sie können Ihren Kunden bitten, jeden Post manuell auf privat zu setzen, aber Sie können sicher sein, dass er ihn ab und zu vergisst. Wenn Sicherheit wichtig ist, ist es besser, darauf zu verzichten.

2
Mridul Aggarwal

Das ist alt - aber so habe ich dieses Problem letztendlich gelöst.

  1. Erstellt einen benutzerdefinierten Beitragstyp für Intranetseiten.
  2. In functions.php wurde eine "force_login" -Funktion hinzugefügt
  3. Beinhaltet die Funktion zum Erzwingen der Anmeldung oben in allen erforderlichen Seitenvorlagendateien.

Sie können dies anpassen, um nur bestimmte Benutzer zuzulassen - zum Beispiel das erwähnte "Members" -Plugin @jason.

Der Code:

In functions.php

/* Require Authentication for Intranet */

function my_force_login() {
global $post;

if (!is_user_logged_in()) {
    auth_redirect();
    }
}    

Oben auf Seite-intranet.php und Single-intranet-pages.php

<?php my_force_login(); ?>

Und das ist es. Es funktioniert.

Hinweise zur Sicherheit:

  • Ich weiß nicht genau warum, aber ich denke nicht, dass die Sicherheit dieser Methode vollständig kugelsicher ist.
  • Es funktioniert in meiner Situation, aber wenn Sie kugelsichere Sicherheit brauchen, müssen Sie noch ein bisschen graben.
  • Weitere Informationen finden Sie in der Antwort von @ Mridul

Wenn Sie eine einfachere Methode haben, die sicherer ist, lassen Sie sie unten und ich werde sie als Antwort markieren.

2
timshutes

Sie können die Sichtbarkeit von Inhalten auf bestimmten Seiten als privat festlegen. Dazu müssen die Besucher über eine WordPress-Anmelde- UND -Berechtigungsstufe verfügen, um den Inhalt anzeigen zu können. Ich würde vielleicht vorschlagen, einen template-intranet.php für die Seite "Intranet" zu erstellen und ein benutzerdefiniertes Menü für die Seiten hinzuzufügen, die Teil des Intranets sind, damit sie auf dieser Seite aufgelistet werden können. Sie müssten immer noch den Status aller Seiten auf Privat setzen.

Eine Problemumgehung, um alle Intranetseiten als privat zu kennzeichnen, ist der functions.php. Sie können eine Bedingung schreiben, um zu prüfen, ob die aktuelle Seite eine Unterseite der Seite "Intranet" ist. Wenn die Seite eine Unterseite des Intranets ist, prüfen Sie, ob der Benutzer angemeldet ist Wenn sie nicht weitergeleitet werden, fahren Sie fort.

1
Rezen

Wenn Sie die Authentifizierung manuell verwalten und in die WordPress-Authentifizierung einbinden möchten, hat @Rezen die richtige Idee. Ich würde es jedoch vorziehen, nur eine bestimmte Seitenvorlage oder eine Liste von Seitenvorlagen zu verwenden, um die Authentifizierung zu überprüfen.

Sie können sich auch Justin Tadlocks "Members" -Plugin ansehen. Es verfügt über eine Menge an benutzerdefiniertem Rollenmanagement, das Sie wahrscheinlich nutzen können.

1
Jason Rhodes

Filter:

add_filter('template_include', 'theme_check_user_permissions', 1, 1);
add_filter('logout_url','theme_logout_redirect');
if(!current_user_can('edit_users')) add_filter( 'wp_die_handler', create_function('',"return 'theme_wp_die_handler';"));

Wenn der Benutzer nicht registriert ist, leiten Sie ihn zur Anmeldeseite vor Ort weiter (guest.php, kein Dashboard)

function theme_check_user_permissions($template) 
{
    return (is_user_logged_in() ? $template : TEMPLATEPATH.'/guest.php');
}

Nach dem Login zur Startseite umleiten

function theme_logout_redirect($url, $redirect = null)
{
    return $url.'&amp;redirect_to='.urlencode(get_bloginfo('url'));
}

Wp die Seite entfernen (nach Hause umleiten)

function theme_wp_die_handler()
{
    wp_redirect(get_bloginfo('url'),307);
    exit;
}
1
Vladimir

Dies ist nur eine Modifikation der Antwort von timshutes -. Wenn Sie möchten, dass bestimmte Seiten eine Anmeldung erfordern und diese nicht in einen benutzerdefinierten Beitragstyp einfügen, können Sie sie zu functions.php hinzufügen:

add_shortcode('need_login', 'shortcode_needLogin');

function shortcode_needLogin() {
    if (!is_user_logged_in()) {
        auth_redirect();
    }
}

Und dann können Sie oben auf den Seiten, für die Sie sich anmelden möchten, Folgendes tun:

[need_login]
1
Chris Rae