Esto en realidad no es difícil. Para agregar una nueva capacidad, llame WP_Roles->add_cap()
. Debe hacer esto solo una vez, ya que se almacenará en la base de datos. Entonces usamos un gancho de activación del complemento.
Nota para otros lectores: Todo el código siguiente es territorio de complementos .
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' );
}
Ahora tenemos que filtrar todas las llamadas para ...
current_user_can( $post_type_object->cap->edit_post, $post->ID );
... porque así es como WordPress comprueba si un usuario puede editar una publicación. Internamente, esto se asignará a la edit_others_posts
capacidad para publicaciones de otros autores.
Por lo tanto, tenemos que filtrar user_has_cap
y analizar nuestra nueva edit_pending_posts
capacidad cuando algunos quieran usarla edit_post
.
También lo he incluido delete_post
, porque esto también es una especie de edición.
Suena complicado, pero es realmente simple:
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
y seguíedit_others_posts
con lo nuevoedit_pending_posts
. Intenté seguiredit_pending_posts
sin los otros dos y el menú de publicación no apareció. Al probar esto, descubrí que podía agregar una nueva publicación, pero no podía guardar el borrador (You are not allowed to edit this post
aviso). ¿Probaste guardar tu propia publicación en este rol? Editar publicaciones pendientes está bien.