Je travaille sur un blog privé et j'aimerais savoir si cela peut être fait avec n'importe quel autre plugin ou de toute autre manière: Disons que nous avons 3 catégories: CA, CB et CC, et 3 utilisateurs, UA, UB et UC , tous peuvent publier mais seulement dans une catégorie particulière, UA dans CA et ainsi de suite. Désormais, lorsque l'un d'entre eux se connectera pour voir le blog, cela affichera uniquement la catégorie de publication à laquelle il était autorisé à accéder pour cet utilisateur. Toute suggestion?
PD: Allow Categories Plugin était supposé le faire mais cela ne fonctionne pas du tout dans wp 3.4.2 et il n’a pas été mis à jour il y a longtemps.
C'est un matériau génial pour un plugin. Cette réponse inclura également comment associer l'utilisateur à la catégorie (il est difficile de vous donner une solution sans le savoir).
Avant de commencer, la vraie viande est à l'étape quatre (chemin en bas). Passez à cela si vous n'avez pas besoin d'un moyen d'associer des catégories à des utilisateurs.
Commençons par envelopper tout dans une classe. Notre classe avec une méthode init
statique qui ajoute des actions et autres, ainsi que quelques constantes de classe.
<?php
WPSE65959_User_One_Cat::init();
class WPSE65959_User_One_Cat
{
/**
* Nonce name.
*
*/
const NONCE = 'wpse65959_nonce';
/**
* The user meta key we'll use
*
*/
const KEY = 'wpse65959_category';
/**
* The taxonomy we'll use. Just 'category' in this case.
*
*/
const TAX = 'category';
public static function init()
{
// add actions here
}
}
Nous accrocherons à edit_user_profile
qui ne sera affiché que lors de la modification des profils d’autres utilisateurs. Vous ne le verrez jamais lors de la modification de votre propre profil, mais vous le verrez lors de la modification d'autres utilisateurs. Notre domaine va saisir toutes les catégories actuelles et les mettre dans un menu déroulant. Nous allons également générer un champ nonce que nous vérifierons plus tard lors de la sauvegarde de l'utilisateur.
<?php
class WPSE65959_User_One_Cat
{
// snip snip
public static function init()
{
add_action(
'edit_user_profile',
array(__CLASS__, 'show_field')
);
}
public static function show_field($user)
{
$terms = get_terms(self::TAX, array('hide_empty' => false));
wp_nonce_field(self::NONCE . $user->ID, self::NONCE, false);
echo '<h4>';
esc_html_e('User Category', 'wpse65959');
echo '</h4>';
printf('<select name="%1$s" id="%1$s">', esc_attr(self::KEY));
echo '<option value="">----</option>';
foreach($terms as $t)
{
printf(
'<option value="%1$s" %2$s>%3$s</option>',
esc_attr($t->term_id),
selected(get_user_meta($user->ID, self::KEY, true), $t->term_id, false),
esc_html($t->name)
);
}
echo '</select>';
}
}
L’autre côté de ce domaine est que nous devons le sauver. Faites-le, accrochez-vous dans edit_user_profile_update
. La fonction vérifiera le nonce et s'assurera que l'utilisateur actuel est autorisé à éditer l'utilisateur.
<?php
class WPSE65959_User_One_Cat
{
// snip snip
public static function init()
{
// snip snip
add_action(
'edit_user_profile_update',
array(__CLASS__, 'save')
);
}
public static function save($user_id)
{
if(
!isset($_POST[self::NONCE]) ||
!wp_verify_nonce($_POST[self::NONCE], self::NONCE . $user_id)
) return;
if(!current_user_can('edit_user', $user_id))
return;
if(isset($_POST[self::KEY]) && $_POST[self::KEY])
update_user_meta($user_id, self::KEY, absint($_POST[self::KEY]));
else
delete_user_meta($user_id, self::KEY);
}
}
Nous avons maintenant un moyen d'associer un utilisateur à une catégorie.
Accrocher dans add_meta_boxes_post
. Si l'utilisateur n'est pas un administrateur, supprimez la zone de catégorie afin que les auteurs ne puissent pas changer de catégorie.
<?php
class WPSE65959_User_One_Cat
{
// snip snip
public static function init()
{
// snip snip
add_action(
'add_meta_boxes_post',
array(__CLASS__, 'remove_metabox')
);
}
public static function remove_metabox()
{
if(current_user_can('manage_options'))
return; // this is an admin. Admins can do what they want.
remove_meta_box(
'categorydiv',
'post',
'side'
);
}
}
Si l'utilisateur n'est pas un administrateur, il ne verra pas la boîte à méta de la catégorie. Nous devons donc nous assurer que ses messages entrent dans la bonne catégorie. Accrochez-vous dans pre_option_default_category
pour accomplir cela.
<?php
class WPSE65959_User_One_Cat
{
// snip snip
public static function init()
{
// snip snip
add_filter(
'pre_option_default_category',
array(__CLASS__, 'default_cat')
);
}
public static function default_cat($false)
{
if(current_user_can('manage_options'))
return $false; // don't change default category for admins
if($cat = get_user_meta(wp_get_current_user()->ID, self::KEY, true))
return $cat; // we have a default category for this user.
return $false; // no default category, return the original value
}
}
Avec un moyen d'associer des utilisateurs à une catégorie, nous pouvons maintenant modifier la requête pour afficher uniquement les publications de leur catégorie.
Crochet dans request
. Vérifiez si l'utilisateur est un administrateur et modifiez la requête pour inclure uniquement leur catégorie.
<?php
class WPSE65959_User_One_Cat
{
// snip snip
public static function init()
{
// snip snip
add_filter(
'request',
array(__CLASS__, 'request')
);
}
public static function request($vars)
{
if(current_user_can('manage_options'))
return $vars; // admins can view whatever
// if the user has a default category, make sure they only see that category
if($cat = get_user_meta(wp_get_current_user()->ID, self::KEY, true))
$vars['cat'] = $cat;
// handle not having a category associated with them here
return $vars;
}
}
Tout ce qui précède en tant que plugin
C'est en fait assez facile avec WP fonctions intégrées et la "hiérarchie de modèles" .
Vous pouvez, en fonction de vos besoins, cibler les modèles single.php
et category-*.php
.
Premièrement, nous devons wp_get_current_user()
. Ensuite, nous pouvons faire plusieurs vérifications, selon ce que vous voulez vérifier. Pour plus de détails, faites une var_dump( wp_get_current_user() );
et comparez vos utilisateurs pour voir quelles données sont disponibles et ce que vous pouvez vérifier par rapport à des informations fiables. Astuce: L'ID utilisateur et le user_login
sont toujours obligatoires et ne peuvent pas être modifiés.
Ensuite, il vous suffit de faire la vérification au-dessus de votre modèle, juste en dessous de l'appel à get_header();
par exemple.
// redirect all users, except the one with the ID of 5 to the index.php page
if ( 5 != wp_get_current_user()->ID )
{
wp_redirect( home_url( '/' ) );
exit;
}
Vous pouvez également le rediriger vers sa page d'auteur et y répertorier toutes les catégories autorisées.
Une autre option serait d’intercepter la requête juste avant que les articles soient extraits de la base de données avec une vérification de l’ID utilisateur - voir les détails dans d’autres questions utilisant posts_clauses
- filter .
Vous pouvez aussi simplement intercepter le hook template_redirect
, comme expliqué dans cette réponse .