Ocultar mensagens protegidas por senha no administrador

4

Estou criando um site para um cliente e estamos usando a funcionalidade nativa de proteção por senha do WordPress.

Existe algum filtro ou algum tipo de ação para filtrar postagens recuperadas no painel de administração? Se eu quiser impedir que todas as postagens protegidas por senha sejam exibidas no painel de administração, digamos que você não seja um administrador.

    
por Dueify 02.09.2015 / 09:53

1 resposta

3

Você pode usar o parâmetro has_password de WP_Query .

Veja um exemplo de como você pode ocultá-lo, para não administradores, na tela edit.php do tipo de postagem post :

/**
 * Hide password protected posts, for non-admins, in the case of 'edit-post' screen id
 *
 * @link http://wordpress.stackexchange.com/a/200426/26350
 */
add_action( 'pre_get_posts', function( \WP_Query $q )
{
    $screen = get_current_screen();

    if(    is_admin() 
        && ! current_user_can( 'manage_options' ) 
        && is_a( $screen, '\WP_Screen' ) 
        && 'edit-post' === $screen->id
    )
        $q->set( 'has_password', false );
} );

Espero que você possa ajustar isso às suas necessidades.

PS: seria útil ter uma função get_current_screen_id() , semelhante à função get_current_user_id() ; -)

Atualizar

/**
 * Hide password protected posts, for non-admins, in the case of 'edit-post' screen id. 
 * Here we don't restrict this to the current user.
 *
 * @link http://wordpress.stackexchange.com/a/200426/26350
 */
is_admin() && add_action( 'posts_where', function( $where, \WP_Query $q )
{
    $screen = get_current_screen();

    if(     
           ! current_user_can( 'manage_options' ) 
        && is_a( $screen, '\WP_Screen' ) 
        && 'edit-post' === $screen->id
    ){
        global $wpdb;
        $uid = get_current_user_id();
        $where .= $wpdb->prepare(
            " AND ( ( {$wpdb->posts}.post_password = '' AND {$wpdb->posts}.post_author != %d )
              OR ( {$wpdb->posts}.post_author = %d ) ) ",
            $uid,
            $uid
        );
    }
    return $where;
}, 10, 2 );

Se WP_Query suportaria field_query :

Seria útil se WP_Query suportasse o argumento field_query input, para facilitar o trabalho com os campos de postagem.

Veja um exemplo:

add_action( 'pre_get_posts', function( \WP_Query $q )
{
    $screen = get_current_screen();

    if(    is_admin() 
        && ! current_user_can( 'manage_options' ) 
        && is_a( $screen, '\WP_Screen' ) 
        && 'edit-post' === $screen->id
    )
        $q->set( 'field_query', 
            [
                'outer_relation' => 'AND',
                'relation'       => 'OR',
                [ 
                    'field'   => 'author',
                    'value'   => get_current_user_id(),
                    'compare' => '=',
                ],
                [
                    'relation'  => 'AND',
                    [
                        'field'     => 'author',
                        'value'     => get_current_user_id(),
                        'compare'   => '!=',
                    ],
                    [
                        'field'     => 'password',
                        'value'     => '',
                        'compare'   => '=',
                    ],
                ]       
            ]
        );
} );

Eu tenho um rascunho para esse plugin, então talvez eu poste aqui quando ele chegar ao estágio alpha; -)

    
por birgire 02.09.2015 / 10:05