Support » Allgemeine Fragen » rolle mit post verknüpfen

  • Gelöst rsedlmeier

    (@rsedlmeier)


    Ciao

    Mir fehlt nur noch ein kleines Stück das ich nicht verstehe.

    angenommen man hat eine rolle basic definiert und in dieser rolle die fähigkeit read_basic_post ausgewählt (mit role editor erstellt)

    wie bekomme ich das hin, dass der user basic nur für ihn gemachte posts lesen kann?

    in der sichtbarkeit der posts kann ich das nicht definieren…

    Gruss&Dank

    • Dieses Thema wurde geändert vor 3 Jahren von rsedlmeier.
Ansicht von 5 Antworten - 1 bis 5 (von insgesamt 5)
  • Moderator Bego Mario Garde

    (@pixolin)

    Ich fand die Frage interessant und gehe deshalb ein wenig ausführlicher darauf ein – erst mit eigenen Code-Beispielen, die aber nicht den Anspruch auf Vollständigkeit haben, sondern als Anregung dienen sollen, danach (wenn dir das alles zu kompliziert wird) dann auch mit einem Plugin-Vorschlag und einem Vorschlag zur Suche weiterer Plugins. Pick dir das raus, womit du am meisten anfangen kannst:

    WordPress verwendet eine Reihe vordefinierter Benutzerrollen, mit denen jeweils eine unterschiedliche Anzahl von Fähigkeiten verknüpft sind. Durch die Zuweisung von Rollen musst du nicht für jeden neuen Benutzer neu entscheiden, welche Fähigkeiten er haben soll und diese einzeln auswählen.
    „Ab Werk“ verfügt WordPress über sechs verschiedene Rollen (Roles) und rund 150 Fähigkeiten (Capabilities). Mit der Funktion add_role() kannst du weitere Rollen definieren und diesen Rollen mit add_cap() Fähigkeiten zuweisen.
    Erstellst du eine neue Inhaltsart (engl. Custom Post Type), kannst du dieser Inhaltsart auch bestimmte Fähigkeiten zuweisen. Um bei deiner Frage zu bleiben, nehmen wir an, dass du in einem Plugin bei Aktivierung des Plugins mit

    function add_role_on_plugin_activation() {
      add_role('basic', 'Basic', array(
        'read' => true,
        'edit_posts' => false,
        'delete_posts' => false,
      ));
    }
    register_activation_hook( __FILE__, 'add_role_on_plugin_activation' );

    eine Benutzerrolle basic angelegst. Diese Benutzerrolle darf zunächst nur alle öffentlich zugänglichen Beiträge lesen, aber keine Beiträge schreiben, veröffentlichen oder löschen.

    Im nächsten Schritt erstellen wir einen Custom Post Type vereinsnews, der wir auch eine neue Fähigkeitsart vereinsnews zuweisen:

    function register_posttype_vereinsnews() {
        register_post_type(
            'vereinsnews',       
            array(
                'public' => true,
    			'show_in_menu' => true,
                'label' => 'Vereinsnews',
                'menu_icon' => 'dashicons-book',
    			'supports' => array(
    			 'title',
                 'editor',
    			),
                'capability_type' => 'vereinsnews',
                'capabilities' => array(
                    'publish_posts' => 'publish_vereinsnews',
                    'edit_posts' => 'edit_vereinsnews',
                    'edit_others_posts' => 'edit_others_vereinsnews',
                    'read_private_posts' => 'read_private_vereinsnews',
                    'edit_post' => 'edit_vereinsnews',
                    'delete_post' => 'delete_vereinsnews',
                    'read_post' => 'read_vereinsnews',
                ),
            )
        );
    }
    add_action('init', 'register_posttype_vereinsnews');

    (Üblicherweise sollten dem Custom Post Type noch diverse Beschriftungen für das Menü und Eigenschaften zugewiesen werden, worauf ich hier verzichte, um den Beitrag halbwegs lesbar zu halten. Hier geht es ja hauptsächlich um die Capabilities. Für die Einrichtung des Custom Post Types wirst du wahrscheinlich lieber ein Plugin wie Custom Post Type UI verwenden wollen. Damit geht das etwas bequemer.)

    Damit Benutzer unserer neu angelegten Benutzerrolle Beiträge dieser Beitragsart lesen dürfen, muss der Benutzerrolle die Fähigkeit zugewiesen werden:

    function add_capability() {
        $role = get_role('basic');
        $role->add_cap('read_vereinsnews');
    }
    add_action('admin_init', 'add_capability');

    (Alternativ hätten wir die Fähigkeit auch gleich bei der Erstellung der Benutzerrolle zuweisen können.)

    Damit der Administrator Beiträge schreiben, veröffentlichen und löschen darf, müssen wir ihm ebenfalls Rechte zuweisen:

    function add_capability_admin() {
        $role = get_role('administrator');
        $role->add_cap('read_vereinsnews');
        $role->add_cap('edit_vereinsnews');
        $role->add_cap('publish_vereinsnews');
        $role2->add_cap('delete_vereinsnews');
    }
    add_action('admin_init', 'add_capability_admin');

    Damit Abonennten die Beiträge der Inhaltsart vereinsnews nicht lesen können, entziehen wir ihnen ausdrücklich das Recht:

    function remove_author_capability()
    {
        $role = get_role('subscriber');
        $role->add_cap('read_vereinsnews', false);
    }
    add_action('admin_init', 'remove_author_capability');

    Auch wenn der Code hier stark vereinfacht ist, haben wir jetzt eine Beitragsart „Vereinsnews“, die nur von Mitgliedern mit der Benutzerrolle „Basic“ gelesen und nur von Administratoren veröffentlich werden darf.

    Das ist eine Möglichkeit, Inhalte gezielt nur einem bestimmten Benutzerkreis zugänglich zu machen. Nun hattest du aber nicht nach „Custom Post Type Posts“ gefragt, sondern ganz allgemein nach Posts, normalen Beiträgen. Hier haben wir das Problem, dass es bei den Capabilities der Inhaltsarten Posts und Pages keine Einschränkungen gibt (WordPress soll ja dazu dienen, Inhalte zu veröffentlichen) und auch sonst Beiträge nicht als nur für eine Benutzergruppe zugänglich gekennzeichnet werden können. Eigentlich hast du nur die Möglichkeit, den Veröffentlichungs-Status der Beiträge auf „Privat“ oder „Passwortgeschützt“ zu ändern, aber nicht granular zu steuern, dass ein Beitrag zwar Privat sein, gleichzeitig aber für eine bestimmte Auswahl deiner Benutzer lesbar sein soll.
    Eine andere Möglichkeit wäre deshalb, den Beiträgen über Custom Fields Meta-Informationen mitzugeben, aus denen sich auslesen lässt, welche Benutzergruppe(n) einen einzelnen Beitrag lesen können soll. Diesen Ansatz verfolgt das Plugin WP JV Post Reading Groups: Du legst nach der Installation unter Einstellungen > Lesen neue Benutzerkreise an und bekommst dann beim Erstellen/Bearbeiten von Beiträgen eine Metabox angezeigt, um den Beitrag einem/mehreren Benutzerkreis/en zuzuweisen. In den Benutzerprofilen findest du ganz am Ende Kontrollkästchen, mit denen du einen Benutzer einer beliebigen Benutzerrolle einem oder mehreren Benutzerkreisen zuweisen kannst. Vergiss nicht, den Beitrag zusätzlich als „privat“ zu markieren. (Eine ausführlichere Anleitung findest du in diesem Beitrag: How to Share Private Posts with User Groups in WordPress)

    Darüber hinaus gibt es im Plugin-Verzeichnis zahlreiche so genannte „Membership“-Plugins, die Inhalte nur freigeschalteten Mitgliedern zugänglich machen. Teilweise haben die Plugins sogar Schnittstellen für eine Zahlungsabwicklung und sind unterschiedlich komplex. Ob und wenn je welches Plugin da für dich in Frage kommt, kannst du nur selber für dich herausfinden. Die Vorstellungen, was so ein Plugin leisten können soll und wie kompliziert es werden darf, gehen weit auseinander.

    Thread-Starter rsedlmeier

    (@rsedlmeier)

    Herzlichen Dank für die ausführliche Antwort, echt klasse.

    Das Plugin Post Readings Group ist genau das, was ich suchte!

    Top

    Gruss&Dank
    RS

    Moderator Hans-Gerd Gerhards

    (@hage)

    @pixolin Kompliment – mal wieder ein richtig toller Beitrag von dir 👏

    Thread-Starter rsedlmeier

    (@rsedlmeier)

    darf ich noch etwas fragen?

    ich habe dann also die rolle basic und die fähigkeit read_basic_posts definiert und es geschafft auch mit WP JV Post Reading Groups das nur auf einen user lesbar zu machen, der die rolle basic hat. soweit so gut.

    jetzt möchte ich noch genau diesen usern der rolle basic eine notification mail senden, wenn ein neuer post live ist. leider kennt mein BN for WP plugin (und andere) nur den trigger „Neuer Beitrag veröffentlicht“ oder „Neuer privater …“.

    wie verknüpftman das nun mit der rolle basic?
    wahrscheinlich brauche ich dazu wieder nur das passende plugin … das ich nicht kenne.

    wäre froh um kurze nachricht

    *) ich will nicht programmieren, weil ich sonst den code pflegen muss, standards, also plugin wäre mir lieber.

    gruss&dank

    RS

    PS:
    eigentlich will ich nur für 3 usergruppen (basic, pro, premium) schreiben und die auch benachrichtigen wenn neue posts live sind.

    • Diese Antwort wurde geändert vor 3 Jahren von rsedlmeier.
    Moderator Bego Mario Garde

    (@pixolin)

    Das habe ich schon so häufig erlebt: Benutzer sucht ein Plugin, schildert ein paar Anforderungen und sobald du in Frage kommende Plugins nennst, werden weitere Anforderungen präsentiert, mit denen die bisher genannten Plugins wieder ausscheiden …

    Plugin-Suche hat nichts mit Anwendungssupport zu tun. Wir helfen gerne, wenn du WordPress, ein Theme oder ein Plugin bereits verwendest und dabei Probleme auftauchen. Bei der Auswahl eines Plugins spielen (eigentlich bei allen Anwender:innen, nicht nur bei dir) so viele subjektive Kriterien eine Rolle, dass eine Hilfe kaum möglich ist.

    Wie auch immer – das Anforderungsprofil „Ich möchte für verschiedene Benutzergruppen Blogbeiträge veröffentlichen, die nur diesen Benutzergruppen zugänglich sind. Die Benutzer sollen per E-Mail informiert werden.“ würde ich (wie schon erwähnt) mit einem Membership-Plugin umsetzen. Es gibt inzwischen eine ganze Reihe sehr guter Plugins für unterschiedliche Anforderungsprofile. Vielleicht findest du hier etwas passendes:

    Die 24 besten WordPress-Mitgliedschafts-Plugins im Jahr 2021

Ansicht von 5 Antworten - 1 bis 5 (von insgesamt 5)
  • Das Thema „rolle mit post verknüpfen“ ist für neue Antworten geschlossen.