Ist es möglich, dass ein Mitwirkender den Autor seiner eigenen Beiträge ändert? Mir ist klar, dass dies sie effektiv von der Post ausschließen wird, das ist was ich will. Ich möchte, dass sie den Autor ändern können, sobald sie mit der Bearbeitung fertig sind.
capabilities
Michael Rogers
quelle
quelle
Antworten:
Ich füge eine zweite Antwort hinzu, weil mein erster Ansatz abgelehnt wurde und dieser nicht die richtige Aufmerksamkeit erhielt.
Die Idee ist, eine benutzerdefinierte Meta-Box zu erstellen, die alle Benutzer auflistet und den Autor in
save_post
Hook ändert . Auf diese Weise können Sie die Benutzerfunktionen nicht beeinträchtigen und der Autorenwechsel erfolgt, wenn die Beiträge bereits gespeichert sind. Der zusätzliche Gewinn besteht auch darin, dass Sie die Liste der Benutzer steuern können, die in der Autoren-Dropdown-Liste verfügbar sind. Schritte zum folgen:Meta-Box registrieren:
Erstellen Sie ein Markup für Ihre Meta-Box:
Haken Sie ein
save_post
, um Daten zu speichern und den Autor zu überschreiben:HINWEIS Denken Sie daran, ein Nonce-Feld hinzuzufügen und es beim Speichern nach dem Speichern zu überprüfen. Auch können Sie mit anderen Haken statt betrachten
save_post
, dhpre_post_update
oderwp_insert_post_data
speichern, zu verarbeiten Daten über neue Post.Ich hoffe, das hilft!
quelle
Tücken:
Obwohl es möglich ist, einem Autor (oder Mitwirkenden) zu erlauben, einen anderen Autor mit
user_has_cap
Filter Hook und einem verwandten CODE seinem eigenen Beitrag zuzuweisen , ist dieser Ansatz selbst grundlegend fehlerhaft . Selbst wenn Sie alle erforderlichen Sicherheitsmaßnahmen ergreifen, handelt es sich dennoch um eine Sicherheitsanfälligkeit, da dadurch die Funktionsarchitektur insgesamt zerstört wird.Lassen Sie mich ein Beispielszenario geben: Angenommen, ein Benutzer mit Autorenrolle hat weniger als ehrenwerte Absichten und spammt einen anderen Autor mit vielen Posts (möglicherweise mithilfe eines Skripts). Wenn sich der Zielautor das nächste Mal anmeldet, sieht er alle diese Beiträge in seinem Namen! Dies wird fortgesetzt, da der andere Autor keine Möglichkeit hat, es zu stoppen! Wir müssen also einen alternativen Ansatz finden, der diesen Fehler nicht aufweist.
Ein besserer Ansatz:
Wenn die Autorenänderung eine notwendige Funktion ist, besteht ein besserer Ansatz darin, den anderen Autor (oder einen Benutzer mit höherer Leistung wie andere Editoren oder Administratoren) in den Prozess der Autorenänderung einzubeziehen, sodass der initiierende Autor möglicherweise nicht in der Lage ist, Spam zu versenden Zielautor.
Um dies zu erreichen, lassen wir den einleitenden Autor den Zielautor aus dem Editor auswählen, aber wir werden den Autor des Beitrags nicht direkt ändern. Stattdessen speichern wir zum Zeitpunkt des Autorenwechsels ein benutzerdefiniertes Post-Meta, in dem die Zielautoren-ID gespeichert wird. Im Admin-Bereich wird dann ein Beitrags-Untermenü angezeigt, in dem alle Beiträge mit der Anforderung zum Ändern des Autors angezeigt werden. Nur der Zielautor und Benutzer mit
edit_others_post
Funktionen (wie Editoren, Administratoren usw.) haben Zugriff auf diese Benutzeroberfläche für Autorenänderungsanforderungen. Über die Benutzeroberfläche genehmigt der Benutzer mit ordnungsgemäßem Zugriff die Änderung, und erst dann erfolgt die endgültige Änderung des Autors.Was passiert mit Posts in der Genehmigungswarteschlange?
Die CODE-Implementierung kann je nach Anforderung variieren. Ohne eine andere CODE-Implementierung können die einleitenden Autoren den Beitrag jedoch ändern oder sogar die Autorenänderungsanforderung innerhalb des Fensters des Genehmigungsprozesses zurücksetzen. Sie werden von der Post ausgeschlossen, sobald die Änderungsanforderung des Autors genehmigt wurde.
quelle
Das Dropdown-Feld Autor wird nur angezeigt , wenn der Benutzer über die entsprechenden
edit_others_posts
Funktionen verfügt. Aus offensichtlichen Gründen möchten Sie Autoren diese Funktion jedoch nicht standardmäßig geben. Die Lösung besteht darin, diese Funktion nur unter bestimmten Umständen bereitzustellen, nämlich wenn er einen seiner eigenen Beiträge bearbeitet. Da die Funktion in die Datenbank geschrieben wird, müssen Sie auch sicherstellen, dass sie auf jeder anderen Seite entfernt wird.Dies ist eine Frage des genauen Timings. Sie möchten die Funktion ändern, nachdem WP entschieden hat, dass der Mitwirkende das Recht hat, den Beitrag zu bearbeiten, aber bevor das Formular der Bearbeitungsseite (
post.php
) generiert wird. Ein geeigneter Haken istadmin_init
.So was:
Ich habe den Code nicht getestet, daher ist er möglicherweise fehlerhaft, aber Sie haben die Idee.
quelle
Ich habe versucht, das zu erreichen, was Sie brauchen, indem ich die Meta-Funktionen der Mitwirkenden gefiltert habe, und es scheint gut zu funktionieren. Alles, was ich hier mache, ist das Hinzufügen der
edit_others_posts
Funktion für Mitwirkende, wenn WordPress dies anfordert.Ich würde jedoch sagen, dass es eine etwas hackige Lösung für mich ist und ich bin mir nicht sicher, ob es völlig sicher ist. Nach dem, was ich nach dem Einfügen meines Filters in
functions.php
WordPress überprüft habe, können Mitwirkende keine Beiträge anderer Benutzer in anderen Kontexten als dem von Ihnen gewünschten bearbeiten. Es scheint in Ordnung zu sein, aber wir können nicht explizit prüfen, ob der aktuelle Benutzer der Autor des aktuell bearbeiteten Beitrags ist (Sie könnten den Beitrag nicht als anderen Benutzer speichern, wenn diese bedingte Prüfung der Funktion hinzugefügt würde) - das das besorgt mich.quelle
edit_others_posts
Funktionen im Wesentlichen die Beiträge anderer bearbeiten können. Wir können den Autor genauso gut zu einem Redakteur machen, das ist wahrscheinlich besser, als ihm eine höhere Fähigkeit zu geben. Die zweite Lösung ist eine Möglichkeit, erfordert aber meiner Meinung nach etwas mehr Arbeit.edit_others_posts
damit, die Bearbeitung der Beiträge anderer Benutzer immer zuzulassen. Bitte testen Sie den Code aus meiner Antwort - auch wenn der Filter vorhanden ist, gibt die Funktionsprüfungif ( ! current_user_can( 'edit_post', $post_id ) )
in github.com/WordPress/WordPress/blob/… immer noch false zurück. Auch hier stimme ich zu, dass es nicht die sichere Lösung ist, wie in meiner Antwort erwähnt, aber ich dachte, es ist erwähnenswert, da es tatsächlich funktioniert. (Entschuldigung für zwei Kommentare hintereinander, ich habe das Charachter-Limit nicht erreicht)Installieren Sie zunächst den Plugin User Role Editor ( https://wordpress.org/plugins/user-role-editor/ ).
Zweitens erstellen Sie mit dem Plugin eine neue Rolle namens Post Manager, zum Beispiel:
Nach dem Erstellen der neuen Rolle können Sie deren Funktionen bearbeiten. Jetzt ist der Moment, in dem Sie Ihr Problem lösen, aber Sie müssen sich zwischen zwei Optionen entscheiden:
(Mach dir noch keine Sorgen um die Rolle des Mitwirkenden)
Zuerst:
edit_others_posts
undpublish_posts
.Zweite:
edit_others_posts
.Nach der Entscheidung klicken Sie auf "Update". Ihre neue Rolle sollte nun die
read
Fähigkeit plus die von Ihnen gewählte (n) haben.Wechseln Sie jetzt zu Ihrer Benutzerprofilseite für Mitwirkende und geben Sie ihnen am Ende der Seite zusätzliche Rollen (Funktion "Benutzerrollen-Editor"):
Jetzt kann jeder Benutzer, der Mitwirkender und Postmanager ist, den Postautor nicht veröffentlichter Posts ändern. Abhängig von Ihrer vorherigen Auswahl kann der Benutzer auch Beiträge veröffentlichen, und wenn dies der Fall ist, kann er den Beitrag nicht mehr bearbeiten.
WICHTIG!!!
Und nur zur Veranschaulichung: WordPress erlaubt standardmäßig nur die
edit_others_posts
Möglichkeit, den Autor des Beitrags zu ändern. Siehe https://github.com/WordPress/WordPress/blob/master/wp-admin/includes/class-wp-posts-list-table.php Zeile 1483.quelle