Ocultar publicaciones de usuarios no registrados

4

Deseo ocultar ciertas publicaciones para cualquier persona que no haya iniciado sesión. Probé el complemento Restrict Content (RC), pero eso solo ocultaba el contenido de las publicaciones, deseo omitir la publicación por completo.

Usando RC como base, probé lo siguiente:

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

Esto tiene un inconveniente sistemático. El último post no puede ser ignorado. Sin embargo, puedo vivir con eso por ahora. Otro problema es que esto también causa un bucle infinito, repitiendo las mismas publicaciones una y otra vez. Descubrí que esto se debe a que have_posts() no solo nos dice que se ha llegado al final de la última publicación, sino que también tiene el efecto secundario de que el contador de publicaciones también se restablece, lo que impide que mi bucle principal llegue al final. Resultó difícil hacer un have_posts() que no sea invasivo, ya que no pude averiguar cómo alcanzar el $wp_query->current_post y el $wp_query->post_count del complemento.

Una solución sería tener la lógica anterior directamente en los temas de los archivos PHP, pero eso tendría que repetirse en cualquier parte que pretendo acceder a una publicación, lo que la hace incómoda y propensa a errores.

¿Hay alguna otra manera de ocultar ciertas publicaciones de usuarios desconocidos?

    
pregunta Enok82 28.04.2016 - 21:45

1 respuesta

2

Jugar con los roles de los usuarios probablemente sería la solución más robusta, sin embargo, un enfoque rápido y sucio sería establecer publicar metadatos para marcar las publicaciones que deberían estar ocultas, luego agregue una meta-consulta para publicar consultas usando a pre_get_posts hook para restringir los resultados a las publicaciones no ocultas para los usuarios que no han iniciado sesión.

Lo siguiente limitará las publicaciones all solicitadas para los visitantes que han cerrado la sesión a aquellos que no tienen los metadatos hide_from_guests asociados, o tienen esos metadatos configurados en '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' );
  

Nota que alterar globalmente cada consulta como esta generalmente se considera una mala práctica. Si es posible, use is_main_query() y otra etiquetas condicionales para limitar las modificaciones de la consulta a solo las consultas relevantes para evitar comportamientos inesperados e impacto en el rendimiento.

Los metadatos 'hide_from_guests' post se pueden establecer en publicaciones individuales mediante la interfaz campos personalizados , postar funciones de metadatos , o implementar una metabox y adjuntarlo a los tipos de publicaciones relevantes, entre otras formas.

    
respondido por el bosco 29.04.2016 - 02:29

Lea otras preguntas en las etiquetas