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.$post->post_author
se pasa como una cadena , pero$args[1]
como un número entero. Algunas veces. Estúpido WordPress! Lo arreglé lanzando ambos a enteros. Y permití a los editores editar sus propias publicaciones publicadas. Si no quieres eso, elimina lareturn
línea en el bloque después// Let users edit their own posts
.return $allcaps;
línea y aparece el mismo problema de permiso con el guardado del borrador. ¿Por qué?$allcaps[ $caps[0] ] = TRUE;
? Muy extraño que esté experimentando esto, lógicamente no tiene sentido que no funcione para mí si lo hace para usted, aquí está mi configuración: i.imgur.com/X3bv9rH.png