Ocultando postagens de usuários não logados

4

Desejo ocultar algumas postagens de alguém que não esteja logado. Eu tentei o plugin Restrict Content (RC), mas isso só escondia o conteúdo das postagens, eu queria omitir a postagem completamente.

Usando o RC como base, tentei o seguinte:

function hideFromUnknownUsers($postObject) {
    $rcUserLevel = get_post_meta ( $postObject->ID, 'rcUserLevel', true );

    if(have_posts())
    {
        if (!(
                !current_user_can ( 'read' ) &&
                (
                    $rcUserLevel == 'Administrator' ||
                    $rcUserLevel == 'Editor' ||
                    $rcUserLevel == 'Author' ||
                    $rcUserLevel == 'Contributor' ||
                    $rcUserLevel == 'Subscriber'
                )
            )) {
            the_post();
        }
    }
}

add_action ( 'the_post', 'hideFromUnknownUsers' );

Isso tem um lado negativo sistemático. O último post não pode ser ignorado. Eu posso no entanto viver com isso por agora. Outro problema é que isso também causa um loop infinito, repetindo os mesmos posts repetidas vezes. Descobri que isso ocorre porque o have_posts() não apenas nos informa que o final do último post foi atingido, mas tem o efeito colateral de que o contador de postagens também é redefinido, impedindo que o loop principal chegue ao fim. Fazer um have_posts() não invasivo se mostrou difícil, pois não consegui descobrir como alcançar o $wp_query->current_post e $wp_query->post_count do plug-in.

Uma solução seria ter a lógica acima diretamente nos arquivos PHP de temas, mas isso teria que ser repetido em todos os lugares que eu pretenda acessar uma publicação, tornando-a incômoda e propensa a erros.

Existe alguma outra maneira de esconder certas mensagens de usuários desconhecidos?

    
por Enok82 28.04.2016 / 21:45

1 resposta

2

Brincar com as funções do usuário provavelmente seria a solução mais robusta, mas uma abordagem rápida e suja seria definir pós meta-dados para marcar as postagens que devem estar ocultas, em seguida, adicione uma meta-consulta para postar consultas usando pre_get_posts hook para restringir os resultados a postagens não ocultas para usuários não logados.

Os seguintes itens limitarão todas postagens consultadas para visitantes desconectados daqueles que não tiverem associados hide_from_guests metadados ou que tenham esses metadados definidos como 'false' :

function wpse225120_hide_posts_from_guests( $query ) {
  // If the user's logged in, exit the function now.
  if( is_user_logged_in() )
    return;

  // Get the current metadata query so we can alter it instead of overwriting it
  $meta_query = $query->get( 'meta_query' );

  // Create a meta-query filtering out hidden posts
  $hidden_meta_query = array(
    'relation' => 'OR',
    array(
      'key'     => 'hide_from_guests',
      'value'   => 'false'
    ),
    array(
      'key'     => 'hide_from_guests',
      'compare' => 'NOT_EXISTS'
    ) 
  );

  // If there's not already a meta-query, supply the one for hidden posts and exit
  if( ! is_array( $meta_query ) || empty( $meta_query ) ) {
    $query->set( 'meta_query', $hidden_meta_query );
    return;
  }

  // If there is an existing meta-query, modify it to support our new hidden posts
  // meta-query as a top-level 'AND' condition, if need be
  if( isset( $meta_query[ 'relation' ] ) && 'OR' === $meta_query[ 'relation' ] )
    $meta_query = array(
      'relation'  => 'AND',
      $meta_query
    );
  }

  // Add the hidden posts meta-query and overwrite $query's old meta-query
  $meta_query[] = $hidden_meta_query;
  $query->set( 'meta_query', $meta_query );
}
add_action( 'pre_get_posts', 'wpse225120_hide_posts_from_guests' );
  

Observação de que a alteração global de todas as consultas como essa geralmente é considerada uma prática ruim. Se possível, use is_main_query() e outros tags condicionais para limitar as modificações de consulta apenas às consultas relevantes para evitar comportamentos inesperados e impacto no desempenho.

Os metadados 'hide_from_guests' post podem ser definidos em postagens individuais usando a interface campos personalizados , postar funções de metadados ou implementar um metabox e anexando-o a tipos de postagem relevantes, entre outras maneiras.

    
por bosco 29.04.2016 / 02:29