web-dev-qa-db-fra.com

Si le rôle post-auteur est X

Pour simplifier la façon dont je présente actuellement les messages en vedette, lorsqu'un message est soumis par un membre à part entière, une valeur post_meta est ajoutée au message, qui est ensuite stylée différemment.

Mais j’aimerais bien le faire en fonction des auteurs de la publication, du rôle de l’utilisateur.

Ainsi, si un utilisateur qui a envoyé le message est un "membre complet", son message est automatiquement présenté sans qu'il soit nécessaire que post_meta soit interrogé.

J'ai essayé quelque chose comme ceci, qui se trouve dans la boucle du modèle d'archive, et ajoute simplement une classe "vedette-listing" à une division d'emballage, mais je ne pense pas que je la regarde de la bonne manière.

 <?php $user = wp_get_current_user();
if ( in_array( 'full_member', (array) $user->roles ) ) { ?>

featured-listing

<?php } ?>

MODIFIER

La partie 1 a été résolue en utilisant la réponse originale de Nathan pour le problème de la classe. Sa réponse a été élargie depuis, ce qui ne fonctionne pas pour moi. Donc, j'ai collé la solution qui a fonctionné ci-dessous:

//* If the post author is a full member, they get a featured listing
function which_class() {
  return post_author_role_in( 'full_member' ) ? 'featured-listing' : 'regular-listing';
}

//* Determine if the post author is in the $role
function post_author_role_in( $role ) {
  return in_the_loop() ? user_role_in( get_the_author_meta( 'ID' ), $role ) : false;
}

//* Determine if the $user_id is in the $role
function user_role_in( $user_id, $role ) {
  return in_array( $role, ( new WP_User( $user_id ) )->roles );
}

Part 2 Cependant, j'ai encore besoin d'une solution pour

Je voudrais toujours utiliser un conditionnel pour masquer complètement certains éléments dans le modèle. Existe-t-il une IF condition qui dit quelque chose comme IF post author is in X role, display this, else display this. ?

S'il vous plaît donnez votre avis :)

1
Randomer11

Une façon de le faire est d'obtenir les données de l'auteur et de vérifier son rôle avec get_userdata()Codex

Pour cela, vous aurez besoin de l'ID utilisateur, que vous pourrez obtenir avec get_post_field()Codex

Vous aurez besoin de l'ID de publication pour utiliser la get_post_field(). Vous pourrez donc utiliser la get_queried_object_id()Codex

Alors, vous auriez quelque chose comme:

//gets the ID of the post
$post_id = get_queried_object_id();

//gets the ID of the author using the ID of the post
$author_ID = get_post_field( 'post_author', $post_id );

//Gets all the data of the author, using the ID
$authorData = get_userdata( $author_ID );

//checks if the author has the role of 'subscriber'
if (in_array( 'subscriber', $authorData->roles)):
    //show the content for subscriber role
else:
    //show the content for every other role
endif;

Y a-t-il un moyen plus rapide/plus simple de le faire? oui

Alors pourquoi je vous ai donné cette solution 'autour du monde'? Parce que de mon expérience, de cette façon, vous pouvez empêcher beaucoup de choses qui pourraient gâcher votre résultat plus tard

Alors, qu'en est-il d'une autre façon de le faire? Puisqu'il y a plusieurs façons de le faire, vous pouvez par exemple utiliser le global $authordata. Vous pouvez vérifier les globales que WordPress a ici

Je pense que vous vous y prenez de la bonne façon. La seule chose que je ferais différemment est de séparer la présentation de la logique. Donc vous auriez:

dans le fichier modèle:

<div class="<?php echo which_class(); ?>">Content</div>
<div class="<?php echo is_member() ? 'featured-listing' : '' ; ?>">Content</div>

dans votre functions.php:

//* Return whether the post author is a member
//* This function will only work in the loop
function is_member() {
  return post_author_role_in( 'full_member' );
}

//* If the post author is a full member, they get a featured listing
//* This function will only work in the loop
function which_class() {
  return is_member() ? 'featured-listing' : 'regular-listing';
}

//* Determine if the post author is in the $role
function post_author_role_in( $role ) {
  return in_the_loop() ? user_role_in( get_the_author_id(), $role ) : false;
}

//* Get the author ID
function get_the_author_id() {
  return get_the_author_meta( 'ID' );
}

//* Determine if the $user_id is in the $role
function user_role_in( $user_id, $role ) {
  return in_array( $role, ( new WP_User( $user_id ) )->roles );
}

Notez que vous ne voulez pas utiliser wp_get_current_user() car cela ne comprendrait que les messages de l'utilisateur actuel et non ceux de tous les membres à part entière.

3
Nathan Johnson