it-swarm.com.de

So weisen Sie bestimmten Benutzern die Möglichkeit zu, bestimmte Seiten/Beiträge/benutzerdefinierte Beitragstypen zu bearbeiten

Ich versuche, eine scheinbar relativ einfache Idee umzusetzen. Im Grunde genommen erstelle ich ein Zugriffssteuerungs-Plugin, um das Anzeigen und Bearbeiten eines benutzerdefinierten Beitragstyps (in diesem Fall "Projekte") zu steuern.

Ich beabsichtige, dass es mehrere Benutzer gibt, die entweder nur Lesezugriff oder Lese-/Schreibzugriff auf bestimmte 'Projekte' haben.

Das System enthält mehrere Projekte, und der Lesezugriff wird gesteuert, indem die Kontrollkästchen für die spezifischen Projekte in den Benutzerprofileinstellungen auf der Site aktiviert werden (siehe unten):

Additional edit options added to User Options

Wenn Sie den Zugriff auf diese Projekte über diese Schnittstelle zuweisen, wird durch den Code auf der aktuellen Seite "Projekte" die Anzeige des Inhalts eingeschränkt, wenn die ID des Projekts keiner der IDs der überprüften Projekte entspricht.

Das alles funktioniert gut, aber ich muss auf die gleiche Weise auch Bearbeitungsfunktionen zulassen. So könnte ich einem Benutzer ermöglichen, eine bestimmte Seite zu lesen, aber auch diese bestimmte Seite zu bearbeiten. Das Problem, das ich habe, ist, dass das, wonach ich suche, nicht in die regulären Rollen und Funktionen zu passen scheint, da ich im Grunde nur möchte, dass alle Benutzer die gleiche Rolle haben (im Grunde nur die Abonnentenrolle). Ich möchte jedoch einem bestimmten Benutzer Bearbeitungsfunktionen für eine bestimmte Seite hinzufügen, wohingegen es bei Rollen im Allgemeinen darum geht, einem Benutzertyp Funktionen hinzuzufügen.

Hoffentlich habe ich es geschafft zu erklären, was ich hier versuche. Ich habe Mühe, den richtigen Code/die richtige Funktion dafür zu finden, obwohl ich mir sicher bin, dass es möglich sein muss, da es Plugins gibt, die den Zugriff auf bestimmte Funktionen ermöglichen Seiten usw., aber natürlich möchte ich mich in diesem Fall nicht auf ein Plugin verlassen, da das, was ich baue, ein Plugin selbst ist!

Update: Ich habe immer wieder versucht, dieses Problem zu beheben, aber bisher kann ich immer noch nicht feststellen, wie der Zugriff auf bestimmte Posts/Seiten usw. möglich ist, ohne eine benutzerdefinierte Rolle/Funktion für jede bestimmte Seite zu erstellen. Dies scheint jedoch ein Problem zu sein Etwas übertrieben und ich bin mir nicht mal sicher, ob das funktionieren würde.

Update 2: Ich habe dieser Frage jetzt ein Kopfgeld hinzugefügt, um hoffentlich jemanden zu inspirieren! ;) Ich habe mich weiter damit befasst, aber obwohl ich andere Plugins gefunden habe, die in der Lage zu sein scheinen, was ich brauche (zusammen mit vielen anderen Funktionen, die ich nicht brauche!), Habe ich es einfach nicht geschafft, es herauszufinden Welcher Code ist erforderlich, um bestimmte Instanzen eines Beitragstyps auf einen bestimmten Benutzer zu beschränken?.

Update 31. Oktober: Ich konnte dank des Codes, den @alexey gepostet hat, etwas zum Laufen bringen. Ich habe jetzt zwei ID-Listen, von denen eine den Lesezugriff und eine den Bearbeitungszugriff steuert. Ich verwende current_user_can('read_projects'), um die Anzeige des Seiteninhalts einzuschränken. Es treten jedoch Probleme auf, da zwei Seiten geladen werden müssen, bevor der Inhalt tatsächlich eingeschränkt wird. Wenn ich zum ersten Mal auf eine Seite klicke, wird der Inhalt angezeigt, aber wenn ich die Seite neu lade, wird der Inhalt korrekt ausgeblendet. Es scheint etwas mit dem Zeitpunkt zu tun zu haben, zu dem user_has_cap ausgelöst wird, aber ich kann anscheinend nichts aufspüren, soweit ich weiß, dass dies ausgelöst werden sollte, bevor der Seiteninhalt gerendert wird. Ich werde hier in diesem Update keinen weiteren Code veröffentlichen, da es keinen einfachen Grund gibt, warum dies nicht funktioniert. Ich würde lieber eine neue Frage posten, als diese fortzusetzen.

6
Rick Curran

Ich kann eine andere Methode vorschlagen.

Zuallererst: Gewähren Sie vollen Zugriff auf Projekte nach Typ ( Beispiel ).

Fügen Sie im Benutzerprofil die ID der zulässigen Beiträge hinzu.

Verwenden Sie dann den folgenden Filter, um den Zugriff einzuschränken, wenn die Beitrags-ID nicht zulässig ist.

function allow_user_to_edit_cpt_filter( $capauser, $capask, $param){

    global $wpdb;

    $allowed_posts_id_for_current_user = array( '29', '30' ); // you need to get these ids yourself
    $post = get_post( $param[2] );

    // If current post isn't allowed then delete edit and delete capabilities
    if( !in_array( $post->ID, $allowed_post_type_ids ) ){
        if( ( $param[0] == "edit_projects") || ( $param[0] == "delete_projects" ) ) { // Change to yours capabilities
            foreach( (array) $capask as $capasuppr) {
               if ( array_key_exists($capasuppr, $capauser) ) {
                  $capauser[$capasuppr] = 0;
               }
            }
        }
    }

    return $capauser;
}
add_filter('user_has_cap', 'allow_user_to_edit_cpt_filter', 100, 3 );
4
Alexey