Permitir a los editores editar publicaciones pendientes pero no borradores

8

Tengo una gran cantidad de usuarios con capacidades de editor que ayudan a pasar por los envíos posteriores. Esta es mi configuración actual para este rol:

Capacidades del editor

Como puede ver, están permitidos edit_postsy edit_others_postsno pueden edit_published_posts. Esto significa que pueden editar publicaciones que están en estado Borrador y Pendiente .

Ahora, quiero restringirlos para que solo puedan editar publicaciones pendientes. Por lo tanto, no podrán tocar borradores de publicaciones (a menos que sean el autor de la publicación). Lamentablemente no hay capacidad como edit_pending_posts... no debería haber .

¿Cómo puedo solucionar esto?

Christine Cooper
fuente

Respuestas:

4

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_postscapacidad para publicaciones de otros autores.

Por lo tanto, tenemos que filtrar user_has_capy analizar nuestra nueva edit_pending_postscapacidad 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;
}
fuxia
fuente
Hice pruebas y me encontré con algunos problemas. En primer lugar, tuve edit_postsy seguí edit_others_postscon lo nuevo edit_pending_posts. Intenté seguir edit_pending_postssin 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 postaviso). ¿Probaste guardar tu propia publicación en este rol? Editar publicaciones pendientes está bien.
Christine Cooper
@ChristineCooper Esto sucedió porque $post->post_authorse 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 la returnlínea en el bloque después // Let users edit their own posts.
fuxia
¡Entendido! Queda un problema. ¡Probé tu código actualizado y funcionó bien! Sin embargo, no quiero permitir que los editores editen sus publicaciones publicadas, así que eliminé esa return $allcaps;línea y aparece el mismo problema de permiso con el guardado del borrador. ¿Por qué?
Christine Cooper
Hm, funciona para mi. Configuración de mi capacidad
fuxia
Solo para confirmar, ¿se refería a eliminar la línea de retorno debajo $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
Christine Cooper