Das ist eigentlich nicht schwer. Rufen Sie an, um eine neue Funktion hinzuzufügen WP_Roles->add_cap()
. Sie müssen dies nur einmal tun, da es in der Datenbank gespeichert wird. Also verwenden wir einen Plugin-Aktivierungs-Hook.
Hinweis für andere Leser: Der gesamte folgende Code ist Plugin-Gebiet .
register_activation_hook( __FILE__, 'epp_add_cap' );
/**
* Add new capability to "editor" role.
*
* @wp-hook "activate_" . __FILE__
* @return void
*/
function epp_add_cap()
{
global $wp_roles;
if ( ! isset( $wp_roles ) )
$wp_roles = new WP_Roles;
$wp_roles->add_cap( 'editor', 'edit_pending_posts' );
}
Jetzt müssen wir alle Anrufe nach ... filtern.
current_user_can( $post_type_object->cap->edit_post, $post->ID );
… Weil WordPress so prüft, ob ein Benutzer einen Beitrag bearbeiten kann. Intern wird dies der edit_others_posts
Fähigkeit für Beiträge anderer Autoren zugeordnet.
Wir müssen also user_has_cap
unsere neuen edit_pending_posts
Funktionen filtern und untersuchen, wenn einige diese Funktionen nutzen edit_post
möchten.
Ich habe auch aufgenommen delete_post
, weil dies auch eine Art Bearbeitung ist.
Klingt kompliziert, ist aber ganz einfach:
add_filter( 'user_has_cap', 'epp_filter_cap', 10, 3 );
/**
* Allow editing others pending posts only with "edit_pending_posts" capability.
* Administrators can still edit those posts.
*
* @wp-hook user_has_cap
* @param array $allcaps All the capabilities of the user
* @param array $caps [0] Required capability ('edit_others_posts')
* @param array $args [0] Requested capability
* [1] User ID
* [2] Post ID
* @return array
*/
function epp_filter_cap( $allcaps, $caps, $args )
{
// Not our capability
if ( ( 'edit_post' !== $args[0] && 'delete_post' !== $args[0] )
or empty ( $allcaps['edit_pending_posts'] )
)
return $allcaps;
$post = get_post( $args[2] );
// Let users edit their own posts
if ( (int) $args[1] === (int) $post->post_author
and in_array(
$post->post_status,
array ( 'draft', 'pending', 'auto-draft' )
)
)
{
$allcaps[ $caps[0] ] = TRUE;
}
elseif ( 'pending' !== $post->post_status )
{ // Not our post status
$allcaps[ $caps[0] ] = FALSE;
}
return $allcaps;
}
edit_posts
undedit_others_posts
weiter mit dem neuenedit_pending_posts
. Ich habe versucht, nuredit_pending_posts
ohne die anderen beiden weiterzumachen, und das Post-Menü wurde nicht angezeigt. Beim Testen stellte ich fest, dass ich einen neuen Beitrag hinzufügen, aber den Entwurf nicht speichern konnte (You are not allowed to edit this post
Hinweis). Haben Sie getestet, um Ihren eigenen Beitrag in dieser Rolle zu speichern? Das Bearbeiten ausstehender Beiträge ist in Ordnung.$post->post_author
es als Zeichenfolge , aber$args[1]
als Ganzzahl übergeben wird. Manchmal. Dummes WordPress! Ich habe es behoben, indem ich beide in ganze Zahlen umgewandelt habe. Und ich erlaubte den Redakteuren, ihre eigenen veröffentlichten Beiträge zu bearbeiten. Wenn Sie das nicht möchten, entfernen Sie diereturn
Zeile im Block danach// Let users edit their own posts
.return $allcaps;
Zeile entfernt und das gleiche Berechtigungsproblem tritt beim Speichern des Entwurfs auf. Warum?$allcaps[ $caps[0] ] = TRUE;
? Sehr seltsam, dass ich dies erlebe, es macht logischerweise keinen Sinn, dass es für mich nicht funktionieren sollte, wenn es für Sie funktioniert. Hier ist mein Setup: i.imgur.com/X3bv9rH.png