web-dev-qa-db-fra.com

Masquer les messages d'une certaine catégorie à moins d'être connecté

Je souhaite masquer les publications appartenant à une certaine catégorie sauf si je suis connecté.

J'ai trouvé du code (attaché) dans le codex qui fonctionne très bien pour la boucle. Mais comment s’assurer que les pages de publication sont également vides?

function exclude_category($query) {
  if (!is_user_logged_in()) {
    $query->set('cat', '-2');
  }
}
add_action('pre_get_posts', 'exclude_category');
1
Henrik

Je voudrais simplement définir le statut des publications pour toutes les publications de cette catégorie sur private. Si vous avez déjà une tonne de publications, écrivez vous-même un petit script en utilisant wp_update_post() pour mettre à jour le statut de publication de toutes ces publications en private. Toutes les publications publiées après cela, vous pouvez simplement définir private ( dans la boîte de méta de publication ) avant de les publier.

La requête principale par défaut affiche uniquement les publications privées destinées aux utilisateurs connectés.

EDIT de COMMENTAIRES

Un ajout du PO dans des commentaires qui pourraient être utiles à l'avenir

Cela a bien fonctionné, sauf que les utilisateurs devaient avoir trop de pouvoir (être rédacteurs) juste pour lire les messages privés. J'ai résolu ce problème en ajoutant ce qui suit dans un plugin: $subRole = get_role( 'subscriber' ); $subRole->add_cap( 'read_private_pages' ); $subRole->add_cap( 'read_private_posts' );

DEUXIÈME ADDITION

Je me demande si nous pouvons simplement définir $posts sur un tableau vide pour toutes les pages de catégorie où 4 est la catégorie, et également sur une seule page si l'article appartient à la catégorie 4.

add_filter( 'the_posts', function ( $posts, $q )
{
    if ( is_user_logged_in() )
        return $posts;

    if (    $q->is_main_query()
         && (    $q->is_category( 4 )
              || (    $q->is_single() 
                   && has_category( 4, $posts[0] )
                 )
             )
    ) {
        return $posts = [];
    }
    return $posts;
}, 10, 2 );

Cela ne devrait retourner aucune publication dans la boucle. Tout cela n’a pas été testé, il faudrait donc effectuer des tests hors ligne appropriés avant de l’utiliser sur un site de production.

Une note suffit. Si une publication appartient à une catégorie qui est un descendant de la catégorie 4 et si la publication n'est pas explicitement affectée à la catégorie 4. Cela vaut également pour les pages de catégorie qui sont des descendants de la catégorie 4. Pour que cela fonctionne, vous auriez besoin d'ajouter des vérifications supplémentaires pour vérifier le parent de niveau supérieur de la catégorie, mais cela peut devenir une lourde charge supplémentaire pour l'exécution

ÉDITION FINALE

Le code de filtre ci-dessus est maintenant testé et fonctionne sur les requêtes principales des pages simples et des pages de catégorie. Sur les pages de catégorie, la boucle n’affiche aucun article et sur une seule page, elle conduit à une page 404. Vous pouvez utiliser pre_get_posts pour supprimer toute autre instance de publication appartenant à la catégorie 2.

add_action( 'pre_get_posts', function ( $q )
{
    if ( is_user_logged_in() )
        return;

    if (    !is_admin() // Target only front end
         && !$q->is_singular() // Do not target singular pages
         && $q->is_main_query() // Target only the main query
    ) {
        $q->set( 'cat', -4 );
    }
});

FLAWS IN DESIGN

Bien que le code fonctionne, il comporte des lacunes, telles que les requêtes personnalisées et les pages utilisées pour répertorier les publications de catégories. C'est une voie dangereuse à prendre et des informations privées peuvent être affichées par inadvertance ( via une requête personnalisée incorrecte, par exemple ) à des utilisateurs non connectés.

Conclusion

Le moyen le plus sûr de résoudre ce problème est de rendre les messages privés qui ne doivent être affichés que pour les utilisateurs connectés. Comme vous l'avez déjà montré ( dans les commentaires ), il est facile d'ajuster les rôles pour leur montrer les messages privés une fois qu'ils sont connectés.

3
Pieter Goosen