Ich habe eine große Anzahl von Benutzern mit Editor Fähigkeiten , die beim Durchlaufen der Post-Einreichungen helfen. Dies ist mein aktuelles Setup für diese Rolle:
Wie Sie sehen, dürfen sie edit_posts
und edit_others_posts
, aber nicht edit_published_posts
. Dies bedeutet, dass sie Posts bearbeiten können, die sich im Status Entwurf und Ausstehend befinden.
Jetzt möchte ich sie auf only beschränken, um ausstehende Posts bearbeiten zu können. Daher können sie Entwurfspostings nicht berühren (sofern sie nicht der Autor des Posts sind). Leider gibt es keine Funktionen wie edit_pending_posts
... sollte es geben.
Wie löse ich das?
Das ist eigentlich nicht schwer. Rufen Sie WP_Roles->add_cap()
auf, um eine neue Funktion hinzuzufügen. 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 Plug-in-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 filtern für ...
current_user_can( $post_type_object->cap->edit_post, $post->ID );
… Denn so prüft WordPress, ob ein Benutzer einen Beitrag bearbeiten kann. Intern wird dies der edit_others_posts
-Funktion für Beiträge anderer Autoren zugeordnet.
Wir müssen also user_has_cap
filtern und unsere neue edit_pending_posts
-Funktion untersuchen, wenn einige die edit_post
-Funktion verwenden möchten.
Ich habe auch delete_post
eingefügt, da 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;
}