Permitir que os editores editem postagens pendentes, mas não rascunhos

8

Eu tenho um grande número de usuários com recursos de editor que ajudam a passar pelos envios de post. Esta é minha configuração atual para esta função:

Recursos do editor

Como você pode ver, eles podem edit_postse edit_others_postsnão podem edit_published_posts. Isso significa que eles podem editar postagens que estão no status Rascunho e Pendente .

Agora, quero restringi-los para poder apenas editar postagens pendentes. Portanto, eles não poderão tocar em rascunhos de postagens (a menos que sejam o autor da postagem). Infelizmente não há capacidade como edit_pending_posts... deveria haver .

Como eu resolvo isso?

Christine Cooper
fonte

Respostas:

4

Na verdade, isso não é difícil. Para adicionar um novo recurso, ligue WP_Roles->add_cap(). Você precisa fazer isso apenas uma vez, porque ele será armazenado no banco de dados. Então, usamos um gancho de ativação de plug-in.

Nota para outros leitores: Todo o código a seguir é território do plug - in .

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' );
}

Agora temos que filtrar todas as chamadas para…

current_user_can( $post_type_object->cap->edit_post, $post->ID );

… Porque é assim que o WordPress verifica se um usuário pode editar uma postagem. Internamente, isso será mapeado para a edit_others_postscapacidade de postagens de outros autores.

Portanto, temos que filtrar user_has_cape analisar nosso novo edit_pending_postsrecurso quando alguém quiser usá-lo edit_post.

Eu incluí delete_posttambém, porque isso também é uma espécie de edição.

Parece complicado, mas é realmente simples:

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
fonte
Fiz testes e tive alguns problemas. Em primeiro lugar, eu tive edit_postse edit_others_postscom o novo edit_pending_posts. Tentei continuar edit_pending_postssem os outros dois e o menu de postagem não apareceu. Ao testar isso, descobri que poderia adicionar uma nova postagem, mas não consegui salvar o rascunho ( You are not allowed to edit this postaviso). Você testou para salvar sua própria postagem nesta função? A edição de postagens pendentes está correta.
Christine Cooper
@ChristineCooper Isso aconteceu porque $post->post_authoré passado como uma string , mas $args[1]como um número inteiro. As vezes. WordPress estúpido! Corrigi-o lançando ambos para números inteiros. E permiti que os editores editassem suas próprias postagens publicadas. Se você não quiser, remova a returnlinha do bloco depois // Let users edit their own posts.
fuxia
Entendi! Uma questão permanece. Testei seu código atualizado e funcionou bem! No entanto, não quero permitir que os editores editem suas postagens publicadas, removi a return $allcaps;linha e o mesmo problema de permissão aparece com o salvamento do rascunho. Por quê?
Christine Cooper
Hum, funciona para mim. Minhas configurações de capacidade
fuxia
Apenas para confirmar, você estava se referindo a remover a linha de retorno em $allcaps[ $caps[0] ] = TRUE;? Muito estranho que eu esteja passando por isso, não faz sentido logicamente que não funcione para mim se funcionar para você, aqui está a minha configuração: i.imgur.com/X3bv9rH.png
Christine Cooper