Type de publication personnalisé pour le `` personnel '' par rapport à l'utilisation de profils utilisateur WordPress?

13

Un scénario que je rencontre toujours est celui où une organisation peut avoir plusieurs employés pour lesquels je veux avoir une sorte de liste et une seule page de profil avec des informations biographiques.

En règle générale, je créais un type de publication personnalisé pour le personnel et peut-être une taxonomie personnalisée si nécessaire.

Mais maintenant, je me demande s'il ne serait pas optimal d'utiliser le type de publication "utilisateur" intégré dans Wordpress. Je me rends compte que je peux personnaliser les champs du profil utilisateur, afficher les listes d'utilisateurs, les profils uniques, etc. Des taxonomies personnalisées sont également possibles, je crois.

Y a-t-il une meilleure pratique ici?

J'ai maintenant un cas où tout le personnel écrit également des articles de blog sous leur propre nom et a donc un compte d'utilisateur de toute façon et j'ai pensé que je ferais mieux de simplement étoffer leurs profils d'utilisateur et de travailler avec author.php au lieu de en utilisant le type de poste personnalisé de «personnel».

Pour l'instant, je vais avec le CPT et j'utilise le plugin Posts 2 Posts pour associer leur publication "personnel" à leur compte "utilisateur" et ainsi créer des listes de leurs articles de blog sur leur page personnelle.

Toute réflexion sur la meilleure façon de mettre en œuvre cela dans wordpress est appréciée.

bongoman
la source

Réponses:

17

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:

  1. La page de profil par défaut sur l'administrateur WP contient peu d'informations.
  2. Dans WP, il n'y a aucune page de profil publique: ce author.phpn'est pas une page de profil.
  3. En plus de la page de profil, vous voulez probablement boucle par le personnel, et bien sûr , vous pouvez utiliser WP_User_Querypour 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:

  1. 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.
  2. Ajoutez des champs personnalisés pour les profils utilisateur et mettez toutes les informations souhaitées.
  3. Créez un modèle de page qui gérera la boucle utilisateur et le profil utilisateur. Comment? Regardez le point 4.
  4. Créez un point de terminaison de réécriture. De cette façon, une URL comme example.com/staffappellera une page (celle à laquelle vous attribuez le modèle créé le 3.) et une URL comme example.com/staff/user/nicknameappellera la même page, mais passera la requête var useravec une valeur nicknameque 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.phpvous 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.

gmazzap
la source