Si les personnes que vous souhaitez afficher publiquement sur un site sont des utilisateurs , c'est-à-dire avoir un compte et écrire des messages, à mon avis, il est préférable d'utiliser la fonctionnalité utilisateur de WordPress: toutes les informations que vous mettriez dans un CPT peuvent également être mises dans des métadonnées utilisateur , et la création d'utilisateurs est obligatoire (ils doivent se connecter), tandis que la création d'un CPT peut être évitée et, pour moi, est redondante.
Cependant, je sais que l'utilisation d'un CPT peut être plus simple , pour certaines raisons:
- La page de profil par défaut sur l'administrateur WP contient peu d'informations.
- Dans WP, il n'y a aucune page de profil publique: ce
author.php
n'est pas une page de profil.
- En plus de la page de profil, vous voulez probablement boucle par le personnel, et bien sûr , vous pouvez utiliser
WP_User_Query
pour ce faire, mais isoler le personnel des utilisateurs qui doivent être cachés peut être un peu difficile: il n'y a pas la taxonomie des utilisateurs et l' utilisation des rôles utilisateur peut générer des problèmes si vous souhaitez attribuer le rôle public à un utilisateur qui ne doit pas être visible publiquement.
Heureusement, ces problèmes ne sont pas de vrais problèmes et peuvent être résolus facilement. Le workflow que je propose est:
- Créez un nouveau rôle d'utilisateur. Vous pouvez cloner des capacités à partir d'un rôle standard, mais créer un rôle et isoler le personnel des autres utilisateurs sera extrêmement simple.
- Ajoutez des champs personnalisés pour les profils utilisateur et mettez toutes les informations souhaitées.
- Créez un modèle de page qui gérera la boucle utilisateur et le profil utilisateur. Comment? Regardez le point 4.
- Créez un point de terminaison de réécriture. De cette façon, une URL comme
example.com/staff
appellera une page (celle à laquelle vous attribuez le modèle créé le 3.) et une URL comme example.com/staff/user/nickname
appellera la même page, mais passera la requête var user
avec une valeur nickname
que vous pouvez utiliser dans la page pour montrer à l'utilisateur profil.
1., 2. et 4. peuvent être facilement réalisés dans un plugin. Je vais vous donner les os de ce plugin, qui devraient être améliorés:
<?php
/**
* Plugin Name: Staff Plugin
* Description: Test
* Author: G.M.
*/
/**
* Add a new role cloning capabilities from editor and flush rewrite rules
*/
function install_staff_plugin() {
$editor = get_role( 'editor' );
add_role( 'staff', 'Staff', $editor->capabilities );
staff_plugin_endpoint();
flush_rewrite_rules();
}
/**
* Remove the role and flush rewrite rules
*/
function unistall_staff_plugin() {
remove_role( 'staff' );
flush_rewrite_rules();
}
/**
* Add the endpoint
*/
function staff_plugin_endpoint() {
add_rewrite_endpoint( 'user', EP_PAGES );
}
/**
* Add custom field to profile page
*/
function staff_plugin_profile_fields( $user ) {
$fields = array(
'facebook' => __('Facebook'),
'twitter' => __('Twitter'),
'photo_id' => __('Photo ID (use attachment id)')
);
echo '<h3>' . __('Staff Information') . '</h3>';
echo '<table class="form-table">';
foreach ( $fields as $field => $label ) {
$now = get_user_meta( $user->ID, $field, true ) ? : "";
printf( '<tr><th><label for="%s">%s</label></th>',
esc_attr($field), esc_html($label) );
printf( '<td><input type="text" name="%s" id="%s" value="%s" class="regular-text" /><br /></td></tr>',
esc_attr($field), esc_attr($field), esc_attr($now) );
}
echo '</table>';
}
/**
* Save the custom fields
*/
function staff_plugin_profile_fields_save( $user_id ) {
if ( ! current_user_can( 'edit_user', $user_id ) ) return;
$fields = array( 'facebook', 'twitter', 'photo_id' );
foreach ( $fields as $field ) {
if ( isset( $_POST[$field] ) )
update_user_meta( $user_id, $field, $_POST[$field] );
}
}
add_action( 'init', 'staff_plugin_endpoint' );
add_action( 'show_user_profile', 'staff_plugin_profile_fields' );
add_action( 'edit_user_profile', 'staff_plugin_profile_fields' );
add_action( 'personal_options_update', 'staff_plugin_profile_fields_save' );
add_action( 'edit_user_profile_update', 'staff_plugin_profile_fields_save' );
register_activation_hook( __FILE__, 'install_staff_plugin' );
register_deactivation_hook( __FILE__, 'unistall_staff_plugin' );
Le plugin fait exactement ce que j'ai dit. Concernant l'ajout de champs personnalisés pour les profils utilisateur, par exemple, j'ai ajouté seulement 3 champs. L'un d'eux est destiné à être utilisé pour une image utilisateur et accepte l'ID d'une pièce jointe. Bien sûr, dans le monde réel, il est préférable d'appeler le téléchargeur de médias et de laisser l'utilisateur choisir de télécharger une image, mais ce n'est pas dans le cadre de cette réponse ...
Une fois le plugin enregistré et activé, nous devons créer le modèle de page, créer une page et attribuer ce modèle. Encore une fois, je posterai ici une preuve de concept pour le modèle:
<?php
/**
* Template Name: Staff Page
*
*/
get_header(); ?>
<div id="primary" class="content-area">
<div id="content" class="site-content" role="main">
<?php
/* The page content */
while ( have_posts() ) : the_post();
$page_link = get_permalink();
the_content();
endwhile;
$required_user = get_query_var( 'user' );
$wanted_meta = array(
'first_name', // This is a standard meta
'facebook', // This is an example of custom meta
'twitter' // This is another example of custom meta
);
if ( empty( $required_user ) ) {
/* The Users Loop */
// Customize the args as you need
$args = array (
'role' => 'Staff',
'orderby' => 'post_count',
'order' => 'DESC',
'fields' => 'all'
);
$user_query = new WP_User_Query( $args );
if ( ! empty( $user_query->results ) ) {
foreach ( $user_query->results as $user ) {
$profile_url = trailingslashit($page_link) . 'user/' . $user->user_nicename;
// This gets ALL the meta fields as a 2 dimensional array (array of arrays)
$meta_fields = get_user_meta( $user->ID );
?>
<div id="user-<?php echo $user->ID ?>">
<?php
// An example of custom meta where to save the id of an attachment
if ( isset($meta_fields['photo_id'][0]) && ! empty($meta_fields['photo_id'][0]) ) {
echo '<a href="' . esc_url($profile_url) . '/">';
echo wp_get_attachment_image( $meta_fields['photo_id'][0], 'medium' );
echo '</a>';
}
?>
<h2><?php echo '<p><a href="' .esc_url( $profile_url ) . '/">' .
$user->display_name . '</a></p>';?></h2>
<p><?php echo $meta_fields['description'][0]; ?></p>
<ul>
<?php
foreach ( $wanted_meta as $key ) {
if ( isset($meta_fields[$key][0]) && ! empty($meta_fields[$key][0]) ) {
?>
<li><?php echo $meta_fields[$key][0]; ?></li>
<?php }
} ?>
</ul>
</div>
<?php
}
}
} else {
/* One User Requested */
$user = get_user_by( 'slug', $required_user );
if ( $user ) {
?>
<div id="user-<?php echo $user->ID ?>">
<?php
$meta_fields = get_user_meta( $user->ID );
if ( isset( $meta_fields['photo_id'][0] ) && ! empty( $meta_fields['photo_id'][0] ) ) {
echo wp_get_attachment_image( $meta_fields['photo_id'][0], 'full' );
}
?>
<h1><?php echo '<p>' . $user->display_name . '</p>';?></h1>
<p><?php echo $meta_fields['description'][0]; ?></p>
<p>
<a href="<?php echo get_author_posts_url($user->ID); ?>"><?php
printf(__('See all posts by %s'), $user->display_name); ?></a> |
<a href="<?php echo $page_link; ?>"><?php _e('Back to Staff'); ?></a>
</p>
<ul>
<?php
foreach ( $wanted_meta as $key ) {
if ( isset( $meta_fields[$key][0] ) && ! empty( $meta_fields[$key][0] ) ) {
?>
<li><?php echo $meta_fields[$key][0]; ?></li>
<?php
}
} ?>
</ul>
</div>
<?php
}
}
?>
</div><!-- #content -->
</div><!-- #primary -->
<?php get_footer(); ?>
Créez maintenant une page et attribuez ce modèle. Attribuez ensuite le rôle d'utilisateur «personnel» à votre personnel et remplissez les profils.
Comme touche finale, dans votre, author.php
vous pouvez ajouter, probablement dans l'en-tête, quelque chose comme ceci:
<div class="author-info">
<?php
$curauth = ( get_query_var( 'author_name' ) ) ?
get_user_by( 'slug', get_query_var( 'author_name' ) ) :
get_userdata( get_query_var( 'author' ) );
$photo = get_user_meta( $curauth->ID, 'photo_id', true );
if ( $photo ) echo wp_get_attachment_image( $photo, 'medium' );
?>
<h2><?php echo $curauth->display_name; ?></h2>
<h3><em><?php echo $curauth->user_description; ?></em></h3>
</div>
C'est tout. Testez-le, améliorez-le et amusez-vous avec.