Support » Plugins » Custom Post Type die Inhalte nur dem Ersteller anzeigen

  • Gelöst Patrick

    (@websterit)


    Hallo zusammen,

    ich bin gerade dabei mich in die Plugin Programmierung einzuarbeiten und bisher funktioniert alles auch super.

    Allerdings habe ich jetzt eine Sache die ich auch mit der Google suche nicht gefunden habe.

    Ich möchte gerne wenn ich ein Custom Post Type erstellt habe, dass die erstellten Beiträge nur dem Eigentümer des Beitrages angezeigt werden. Also Benutzer 2 hat 5 Beiträge erstellt und es gibt insgesamt 10 dann sollen ihm nur die 5 angezeigt werden die ihm gehören. Ich als Admin soll alle Beiträge sehen können.

    Wie kann ich dies realisieren?

    Vielen dank schon mal für die Hilfe

    Liebe Grüße Patrick

Ansicht von 15 Antworten - 1 bis 15 (von insgesamt 17)
  • Schau dir mal diesen Blog-Beitrag an:

    https://3.7designs.co/blog/2014/08/restricting-access-to-custom-post-types-using-roles-in-wordpress/

    Ich denke, wenn du im letzten Code-Snippet (function psp_add_role_caps()) das

    $role->add_cap( 'edit_others_psp_projects' );
    $role->add_cap( 'delete_others_psp_projects' );

    weglässt, müsste das deinen Vorgaben entsprechen?

    Thread-Ersteller Patrick

    (@websterit)

    Ich habe das jetzt eingefügt.

    Leider funktioniert es nicht wie ich mir das gedacht habe.

    Der abonennt kann leider weiterhin auch z.B. die Einträge des administrators sehen.
    Ich habe mit den Capabilies etwas gespielt aber z.B. kann der abonennt immer bearbeiten.

    Ich versuche natürlich auch weiterhin selbst auf die Lösung zu kommen und probiere, aber bis jetzt leider ohne erfolg.

    es müsste nach meinem wissen heissen:

    Select user From table where user_id = $is_user_logged_in
    *Select abfrage gilt nur als Beispiel.

    oder so in die Richtung.

    Aber eben mit WordPress Funktionen wenn es das gibt.

    • Diese Antwort wurde geändert vor 2 Jahre, 4 Monaten von Patrick.

    Da stimmt dann aber was nicht. In dem Blogbeitrag siehst du ja sogar das Backend des Nutzers mit der neuen Benutzerrolle* – da gibt es keine Beiträge oder Seiten zu editieren. (*Du musst dem Benutzer natürlich auch die Rolle zuweisen. Er ist dann kein Abonnent mehr.)

    Für das was du da mit einer Datenbankabfrage versuchst, stellt WordPress Funktionen zur Verfügung.

    Ich hab mal rasch ein Beispiel erstell:
    https://github.com/pixolin/holidays

    Achte darauf, dass die Benutzerrollen beim Aktivieren des Plugins eingerichtet werden. app_cap() und remove_cap() sind ein bisschen tückisch: die Berechtigungen werden einmalig in die Datenbank geschrieben und beim Deaktivieren/Löschen des Plugins nicht (ohne weiteres Zutun) wieder entfernt.

    Korrekterweise sollte das Plugin also noch einen register_deactivation_hook() haben, mit der die Benutzerrechte wieder aus der Datenbank entfernt werden!

    Thread-Ersteller Patrick

    (@websterit)

    Vielen dank für das Beispiel.

    Ich bekomme beim Aufruf, folgenden Error:

    Fatal error: Uncaught Error: Call to a member function add_cap() on null in /www/htdocs/w017a628/seo-rec.net/wp-content/plugins/wp-rating/inc/meta-box2.php:103 Stack trace: #0 /www/htdocs/w017a628/seo-rec.net/wp-includes/class-wp-hook.php(286): pix_add_role_caps(“) #1 /www/htdocs/w017a628/seo-rec.net/wp-includes/class-wp-hook.php(310): WP_Hook->apply_filters(NULL, Array) #2 /www/htdocs/w017a628/seo-rec.net/wp-includes/plugin.php(465): WP_Hook->do_action(Array) #3 /www/htdocs/w017a628/seo-rec.net/wp-admin/admin.php(169): do_action(‚admin_init‘) #4 /www/htdocs/w017a628/seo-rec.net/wp-admin/index.php(10): require_once(‚/www/htdocs/w01…‘) #5 {main} thrown in /www/htdocs/w017a628/seo-rec.net/wp-content/plugins/wp-rating/inc/meta-box2.php on line 103`

    Ich verstehe leider nicht genau was hier passiert.

    Dankeschön

    Lieben Gruss Patrick

    Hm, soviel zu „rasch“ ein Plugin aufsetzen … 🙂

    Ich hab eine Änderung vorgenommen und das Plugin auf GitHub aktualisiert. Schau mal, ob es damit klappt. (Bisherige Version löschen, neue Version herunterladen und im Backend aktivieren.)

    Eventuell gibt es auch einen Konflikt mit dem Plugin wp-content/plugins/wp-rating – ist das ein eigenes Plugin von dir?

    Thread-Ersteller Patrick

    (@websterit)

    Ich habe das jetzt getestet und das Problem ist, der normale Benutzer sieht den CPT gar nicht mehr.

    ich habe noch etwas anderes gefunden, das funktioniert auch fast, leider kann der normale Benutzer aber alle auswählen.

    function posts_for_current_author($query) {
      global $user_level;
    
      if(is_admin() && $user_role == 'author') { // Valid for all users except the administrators
        global $user_ID;
        $query->set('author', $user_ID);
        unset($user_ID);
      }
      unset($user_level);
    
      return $query;
    }
    add_filter('pre_get_posts', 'posts_for_current_author');

    Wie kann ich jetzt realisieren, dass er nicht mehr alle ausschließt?

    Ich dachte alle per css auf display:none; zu setzten, allerdings wollte ich das eben nur für den einen CPT machen, ich finde nicht wie die css Anweisung für den CPT in css sein muss.

    Vielleicht, kann man oder muss man dafür eine bestimmte Sache in PHP programmieren.

    Danke

    LG Patrick

    Ich habe das jetzt getestet und das Problem ist, der normale Benutzer sieht den CPT gar nicht mehr.

    Richtig. Den Custom Post Type sehen nur Benutzer, die die Rolle „Tourist“ zugewiesen bekommen. Hast du dir den Code des Plugins angeschaut? Ich wollte dir eigentlich keine fertige Lösung liefern, sondern nur ein Beispiel, wie es gehen könnte.

    Ich habe noch etwas anderes gefunden, das funktioniert auch fast, leider kann der normale Benutzer aber alle auswählen.

    Meinst du sowas hier?
    https://github.com/pixolin/holidays/blob/master/holidays.php#L145

    Ich dachte alle per css auf display:none; zu setzten …

    Das könnte dann jeder Nutzer mit geringstem Aufwand umgehen.

    Vielleicht, kann man oder muss man dafür eine bestimmte Sache in PHP programmieren.

    So wie in dem Plugin, dass ich extra für diesen Thread programmiert habe? 🙂

    Thread-Ersteller Patrick

    (@websterit)

    Tut mir leid, ich hab mir das jetzt nochmal angesehen.
    ich bekomme die neue Rolle nicht angezeigt im Backend wenn ich die verteilen mag.

    Klar ich brauche einen Lerneffekt da hast du recht.

    Das mit dem CSS hast du natürlich recht.

    😉
    Ja genau sowas wenn ich noch die Benutzerrolle angezeigt bekomme :-).

    Damit wir nicht aneinander vorbeireden:

    1. Du installierst und aktivierst das Plugin. Dadurch wird deiner WordPress-Installation eine neue Benutzerrolle „Tourist“ hinzugefügt.
    2. Du erstellst zwei Benutzer und weist den beiden Benutzern die Benutzerrolle „Tourist“ zu.
    3. Du wechselst den Benutzer (nützlich: User Switching) auf einen der neu angelegten Benutzer.
    4. Der Benutzer sollte im Backend nur sein Profil, die Mediathek und ein Menü „Holidays“ sehen. Dort fügt er einen neuen „Holiday“ hinzu. Überschrift „Spanien“, Text „Ferien auf Mallorca“, veröffentlichen. Das kannst du bei Belieben zwei, dreimal wiederholen.
    5. Du wechselst auf den zweiten Benutzer mit Rolle „Tourist“. Der sollte die bereite hinzugefügten Holiday-Beiträge nicht sehen, kann aber eigene Beiträge erstellen. Hier erstellst du einen neuen Beitrag mit Überschrift „China“, text „An der Großen Mauer.“
    6. Du wechselst nochmal auf den ersten Benutzer. Der sieht seine Beiträge „Spanien“, etc., nicht aber „China“.
    7. Du wechselst zum Admin. Der sollte alle Beiträge (Spanien, China) sehen, bearbeiten und auch wieder löschen können.
    8. Du deaktivierst und löschst das Plugin. Dadurch wird die Benutzerrolle „Tourist“ entfernt, die Benutzer haben keine Rolle und damit keinen Zugriff auf das Backend mehr.
    Thread-Ersteller Patrick

    (@websterit)

    So ich habe das jetzt mal genauso gemacht und bekomme nun beim Aktivieren folgende Meldung?

    Ich habe den Code von Github 1 zu 1 Kopiert.

    Fatal error: Cannot redeclare posts_for_current_author() (previously declared in /www/htdocs/w017a628/seo-rec.net/wp-content/plugins/wp-rating/inc/meta-box.php:75) in /www/htdocs/w017a628/seo-rec.net/wp-content/plugins/holiday/holiday.php on line 136

    • Diese Antwort wurde geändert vor 2 Jahre, 4 Monaten von Patrick. Grund: Erl

    Liest du solche Fehlermeldungen eigentlich auch?

    Fatal error: Cannot redeclare posts_for_current_author() (previously declared in /www/htdocs/w017a628/seo-rec.net/wp-content/plugins/wp-rating/inc/meta-box.php:75)

    … ist doch eigentlich ganz offensichtlich?

    „Ich kann die Funktion posts_for_current_author() nicht nochmal verwenden, weil sie bereits im Plugin wp-rating vorkommt.“

    Bei einem Auftrag für einen Kunden hätte ich die Funktionen in eine Klasse/einen Namespace gepackt, um solche Konflikte zu vermeiden. Hier wollte ich dir aber nur eine schnelle Demo geben. Schade, da habe ich wohl zu viel vorausgesetzt.

    Abgesehen davon …

    Ich habe den Code von Github 1 zu 1 Kopiert.

    Wieso? Du kannst doch das komplette Plugin von GitHub als Zip-Datei herunterladen:
    https://github.com/pixolin/holidays/archive/master.zip

    (Unter Clone or Download > Download als Zip-Datei, dann in WordPress unter Plugins > Hinzufügen > Hochladen installieren und anschließend aktivieren. Solche Basics setzten wir aber eigentlich voraus, wenn jemand Plugins programmieren möchte.)

    Thread-Ersteller Patrick

    (@websterit)

    Ich habe meinen Fehler gerade festgestellt.
    Ich hatte vergessen mein anderes Plugin wo ich das getestet hatte zu deaktivieren.

    Super Vielen dank dafür super!!

    Ja ich hatte nur den Code aus der holidays.php Kopiert, ich bin leider bei sowas immer etwas hektisch.

    Dennoch nochmal vielen dank, ich verstehe jetzt wie gesagt was falsch gelaufen ist!

    Dankeschön!

    … und weiter geht’s mit Punkt 2. 🙂

    Thread-Ersteller Patrick

    (@websterit)

    Welcher 2. Punkt?
    🙂

    Ich kann das nun nutzen und werde es nun nach meinen Bedürfnissen umschreiben.
    So habe ich jetzt die Funktionalität die ich brauche für mein weiteres vorhaben.

    Meintest du das oder was spezielles?

Ansicht von 15 Antworten - 1 bis 15 (von insgesamt 17)
  • Das Thema „Custom Post Type die Inhalte nur dem Ersteller anzeigen“ ist für neue Antworten geschlossen.