web-dev-qa-db-fra.com

Masquer les publications des utilisateurs non connectés

Je souhaite masquer certains messages pour tous ceux qui ne sont pas connectés. J'ai essayé le plugin Restreindre le contenu (RC), mais cela ne masquait que le contenu des messages. Je souhaite supprimer complètement le message.

En utilisant RC en tant que fondation, j'ai essayé les solutions suivantes:

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

Cela a un inconvénient systématique. Le dernier message ne peut pas être ignoré. Je peux cependant vivre avec ça pour le moment. Un autre problème est que cela provoque également une boucle infinie, répétant les mêmes messages encore et encore. J'ai découvert que c'est parce que la have_posts() ne nous dit pas seulement que la fin du dernier message a été atteinte, mais a pour effet secondaire que le compteur de messages est également réinitialisé, empêchant ainsi la fin de ma boucle principale. Faire une have_posts() qui sont non invasives s'est avéré difficile car je ne pouvais pas comprendre comment atteindre le $wp_query->current_postand $wp_query->post_count à partir du plugin.

Une solution serait d’avoir la logique ci-dessus directement dans les fichiers de thèmes PHP, mais cela devrait être répété partout où j’ai l’intention d’accéder à un article le rendant lourd et sujet aux erreurs.

Existe-t-il un autre moyen de masquer certains messages d'utilisateurs inconnus?

3
Enok82

Ficher avec des rôles d’utilisateur serait probablement la solution la plus robuste. Cependant, une approche rapide et fictive consisterait à définir post meta-data pour marquer les publications à masquer, puis d’ajouter une meta-query à publier. requêtes en utilisant a pre_get_posts hook afin de limiter les résultats aux publications non masquées pour les utilisateurs non connectés.

Les éléments suivants limiterontall) pour les visiteurs déconnectés de ceux pour lesquels aucune méta-donnée hide_from_guests n'est associée, ou dont la métadonnée est définie sur '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' );

Note modifier globalement chaque requêteest considéré comme une mauvaise pratique. Si possible, utilisez is_main_query() et d'autres balises conditionnelles pour limiter les modifications de requête. aux requêtes pertinentes afin d'éviter les comportements inattendus et l'impact sur les performances.

Les métadonnées de poste 'hide_from_guests' peuvent être définies sur des articles individuels à l'aide de l'interface champs personnalisés , des fonctions de métadonnées post , ou en implémentant un metabox personnalisé et en l'attachant aux types d'articles correspondants, entre autres façons.

1
bosco

Utilisez ce code sur le fichier functions.php de votre thème enfant ..

//Hide for non-logged-in users (public visitors)
 function bp_logged_out_page_template_redirect() { if( ! is_user_logged_in() && is_page( 'members' )|| is_page( 'activity' ) || bp_is_user() ) { wp_redirect( home_url( '/register/' ) ); exit(); } } 
add_action( 'template_redirect', 'bp_logged_out_page_template_redirect' );

L'extrait ci-dessus fera:

SI l’utilisateur n’est pas connecté .. ET le nom de la page est "membres" OR "activité" OR page-profil-bp .. ALORS, il sera redirigé vers la page REGISTER.

Réf.: https://vvcares.com/w/wordpress-hide-pages-for-non-logged-in-users/

0
MAN5