web-dev-qa-db-fra.com

Comment dois-je demander une autorisation/connexion pour afficher un ensemble spécifique de messages/pages?

Je travaille sur un site wordpress pour un client qui souhaite un "intranet" interne pour ses employés. Les besoins fondamentaux sont:

  1. Communiquer les choses en interne
  2. Documents d'entreprise importants de la maison
  3. Fournir un accès rapide aux ressources pour les employés.

Cette information est sensible et réservée aux employés. Ils souhaiteraient que chaque employé ait un nom d'utilisateur/mot de passe et ne puisse voir les informations et les documents qu'une fois connectés.

J'ai vu ces plugins, et quelques-uns du même genre, mais ils semblent limités et, bien sûr, ils sont complètement obsolètes:

Je sais que je peux protéger par mot de passe des articles/pages individuels. Puis-je protéger par mot de passe toute une catégorie de messages ou, mieux encore, un type de message personnalisé? Fondamentalement, je dois regrouper certaines pages/publications sous un identifiant. Les informations sont sensibles et ne peuvent donc pas être disponibles, par exemple dans le flux RSS. Comment puis-je faire ceci?

  • Option 1 (moins souhaitable): créer une construction wordpress complète derrière un mur de connexion
  • Option 2 (plus souhaitable): placez simplement les pages/messages internes derrière le mur de connexion

Conclusion: l’option 1 m’intéresse si c’est beaucoup plus facile, mais je préférerais l’option 2. À l’heure actuelle, après quelques recherches, je ne trouve que des plugins obsolètes qui permettent de résoudre ce problème et ne paraissent pas trouver de solution fiable. moyen de tirer l'un ou l'autre. Merci de votre aide!

3
timshutes

Il est possible de cocher les pages d'archives et les pages simples correspondantes

Mais la seule chose que vous devriez absolument faire avec toutes les autres solutions que vous prenez est d’utiliser le filtre the_posts. Il filtre les publications que tout WP_Query récupère. Vous obtiendrez un tableau d'objets post. Vérifiez la condition et désélectionnez l'objet s'il y est. Celui-ci est destiné pour quand quand toutes les autres solutions sont contournées. Ceci est le dernier recours si un plugin inconnu récupère les publications sans que vous en ayez la moindre idée.

Une autre chose à utiliser est le filtre pre_get_posts pour vérifier les variables de la requête et les modifier si nécessaire.

posts_where filter, utilisez-le pour ajouter une autre clause where à la requête mysql

Ce n'est pas complètement sécurisé mais cela devrait couvrir la plupart des cas et même la plupart des plugins externes.

Si vous utilisez un type de publication personnalisé, cela devient beaucoup plus facile. Vous pouvez définir des fonctionnalités personnalisées pour ce post_type, puis les attribuer uniquement aux utilisateurs d'un rôle particulier.

Vous pouvez demander à votre client de définir manuellement chaque message sur privé, mais vous pouvez être sûr qu'il l'oubliera maintenant et ensuite. Si la sécurité est importante, il vaut mieux ne pas y aller.

2
Mridul Aggarwal

C'est vieux - mais voici comment j'ai résolu ce problème en fin de compte.

  1. Création d'un type de publication personnalisé pour les pages intranet.
  2. Ajout d'une fonction "force_login" dans functions.php
  3. Inclut la fonction de connexion forcée en haut de tous les fichiers de modèle de page nécessaires.

Vous pouvez personnaliser cela pour n’autoriser que certains utilisateurs - par exemple, en utilisant le plugin "Membres" @jason mentionné.

Le code:

Dans functions.php

/* Require Authentication for Intranet */

function my_force_login() {
global $post;

if (!is_user_logged_in()) {
    auth_redirect();
    }
}    

En haut de page-intranet.php et single-intranet-pages.php

<?php my_force_login(); ?>

Et c'est tout. Ça marche.

Notes sur la sécurité:

  • Je ne sais pas exactement pourquoi, mais je ne pense pas que la sécurité de cette méthode soit totalement à l'épreuve des balles.
  • Cela fonctionne dans mon cas, mais creusez un peu plus si vous avez besoin d'une sécurité à toute épreuve.
  • Voir la réponse de @ Mridul ci-dessous pour plus d'informations

Si vous avez une méthode simple, plus sûre, laissez-la ci-dessous et je la marquerai comme solution.

2
timshutes

Vous pouvez définir la visibilité du contenu sur privé sur des pages spécifiques, ce qui obligerait les visiteurs à disposer d'un identifiant de connexion WordPress ET de niveaux d'autorisation pour afficher le contenu. Ce que je suggérerais peut-être, c’est de créer un template-intranet.php pour la page "Intranet" et d’ajouter un menu personnalisé pour les pages qui font partie de l’intranet afin qu’elles puissent être répertoriées sur cette page. Vous devez toujours définir le statut de toutes les pages sur Privé.

Une solution de contournement pour rendre toutes les pages intranet privées serait dans le functions.php vous pouvez écrire une condition pour vérifier si la page en cours est une sous-page de la page "Intranet" - si la page est une sous-page d'intranet, puis vérifier si l'utilisateur est connecté , et s’ils ne sont pas redirigés, sinon continuez.

1
Rezen

Si vous souhaitez gérer manuellement l'authentification et l'intégrer dans l'authentification WordPress, @Rezen a la bonne idée. Je préférerais simplement utiliser un modèle de page spécifique ou une liste de modèles de page pour vérifier l'authentification.

Vous pouvez également consulter le plug-in "Membres" de Justin Tadlock, qui contient probablement beaucoup de fonctions de gestion des rôles personnalisés que vous pouvez exploiter.

1
Jason Rhodes

Filtres:

add_filter('template_include', 'theme_check_user_permissions', 1, 1);
add_filter('logout_url','theme_logout_redirect');
if(!current_user_can('edit_users')) add_filter( 'wp_die_handler', create_function('',"return 'theme_wp_die_handler';"));

Si l'utilisateur n'est pas enregistré, redirigez-le ensuite vers la page de connexion sur le site (guest.php, pas de tableau de bord).

function theme_check_user_permissions($template) 
{
    return (is_user_logged_in() ? $template : TEMPLATEPATH.'/guest.php');
}

Après la connexion, redirection vers la page d'accueil

function theme_logout_redirect($url, $redirect = null)
{
    return $url.'&amp;redirect_to='.urlencode(get_bloginfo('url'));
}

Supprimer la page wp die (redirection vers la maison)

function theme_wp_die_handler()
{
    wp_redirect(get_bloginfo('url'),307);
    exit;
}
1
Vladimir

Ceci est juste une modification de timshutes 'answer - si vous voulez que certaines pages nécessitent un identifiant de connexion et que vous ne voulez pas les mettre dans un type de message personnalisé, vous pouvez ajouter à functions.php:

add_shortcode('need_login', 'shortcode_needLogin');

function shortcode_needLogin() {
    if (!is_user_logged_in()) {
        auth_redirect();
    }
}

Et en haut des pages pour lesquelles vous souhaitez demander une connexion, vous pouvez simplement faire:

[need_login]
1
Chris Rae