web-dev-qa-db-fra.com

Type de message personnalisé pour "personnel" ou utilisation de profils d'utilisateurs wordpress?

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

En règle générale, je créerais un type de message personnalisé pour le personnel et éventuellement une taxonomie personnalisée.

Mais maintenant, je me demande s’il pourrait ne pas être optimal d’utiliser le type de poste "utilisateur" intégré dans Wordpress. Je réalise que je peux personnaliser les champs de profil utilisateur, afficher des listes d'utilisateurs, des 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ù tous les membres du personnel écrivent également des billets de blog sous leur propre nom. Ils ont donc toujours un compte utilisateur et je me suis dit que je ferais peut-être mieux de compléter leur profil d’utilisateur et de travailler avec author.php au lieu de utiliser le type de "personnel" personnalisé.

Pour l'instant, j'utilise le CPT et utilise le plug-in Posts 2 Posts pour associer leur publication "staff" à leur compte "utilisateur" et créer ainsi des listes de leurs blogs sur leur page personnelle.

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

11
bongoman

Si les personnes que vous souhaitez afficher publiquement sur un site sont users , c’est-à-dire que vous avez un compte et écrivez des publications, j’estime qu’il est préférable d’utiliser la fonctionnalité utilisateur de WordPress: toutes les informations que vous pouvez mettre dans un CPT également être mis dans les métadonnées de l'utilisateur, et la création d'utilisateurs est obligatoire (ils doivent se connecter), tandis que la création d'un CPT peut être évité et, pour moi, est redondant.

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 WP admin contient peu d'informations.
  2. Dans WP, il n'y a pas de page de profil publique: author.php n'est pas une page de profil.
  3. En plus de la page de profil, vous voudrez probablement loop à travers le personnel, et vous pouvez bien sûr utiliser WP_User_Query pour le faire, mais isoler le personnel des utilisateurs qui doivent être hidden peut être un peu difficile: il n’ya pas de taxonomie utilisateur et l’utilisation de 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 réels problèmes et peuvent être résolus facilement. Le flux de travail que je suggère est:

  1. Créez un nouveau rôle d'utilisateur. Vous pouvez cloner des fonctionnalités à partir d'un rôle standard, mais la création d'un rôle et l'isolement du personnel des autres utilisateurs seront extrêmement faciles.
  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 noeud final de réécriture. Ainsi, une URL telle que example.com/staff appellera une page (celle que vous affectez au modèle créé sur 3.) et une URL telle que example.com/staff/user/nickname appelle la même page, mais transmet la requête var user avec la valeur nickname que vous pouvez utiliser dans la page. pour afficher le profil de l'utilisateur.

1., 2. et 4. peuvent être facilement réalisés dans un plugin. Je vais vous donner les bones de ce plugin, cela devrait être amélioré:

<?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. En ce qui concerne l'ajout de champs personnalisés pour les profils d'utilisateurs, à titre d'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 l’éditeur de média et de laisser l’utilisateur choisir de télécharger une image, mais cela n’entre pas dans le champ 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 assignez ce modèle. Attribuez ensuite le rôle d'utilisateur "personnel" à votre personnel et remplissez les profils.

Pour terminer, 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.

15
gmazzap