Tipo di post personalizzato per "staff" rispetto all'utilizzo dei profili utente di wordpress?


13

Uno scenario che continuo a incontrare è quello in cui un'organizzazione potrebbe avere diversi membri del personale per i quali voglio avere una sorta di elenco e una singola pagina di profilo con informazioni biografiche.

In genere creerei un tipo di post personalizzato per il personale e forse una tassonomia personalizzata, se necessario.

Ma ora mi chiedo se potrebbe non essere ottimale utilizzare il tipo di post "utente" incorporato in Wordpress. Mi rendo conto di poter personalizzare i campi del profilo utente, visualizzare elenchi di utenti, profili singoli ecc. Sono possibili anche tassonomie personalizzate.

C'è una buona pratica qui?

Ora ho un caso in cui tutto il personale sta scrivendo anche post sul blog con il proprio nome e quindi ha comunque un account utente e mi è venuto in mente che forse sto meglio semplicemente riempendo i loro profili utente e lavorando con author.php invece di utilizzando il tipo di post personalizzato di "staff".

Per ora vado con il CPT e utilizzo il plug-in Posts 2 Posts per associare i loro post "staff" al loro account "user" e quindi creare elenchi dei loro post sul blog sulla loro pagina personale.

Sono apprezzati tutti i pensieri su come implementare al meglio questo in wordpress.

Risposte:


17

Se le persone che vuoi mostrare pubblicamente su un sito sono utenti , cioè hanno un account e scrivono post, secondo me è molto meglio usare la funzionalità utente di WordPress: tutte le informazioni che inseriresti in un CPT possono anche essere inserite nei metadati degli utenti e la creazione di utenti è obbligatoria (devono effettuare l'accesso), mentre la creazione di un CPT può essere evitata e, per me, è ridondante.

Tuttavia, so che l'utilizzo di un CPT può essere più semplice , per alcuni motivi:

  1. La pagina del profilo predefinito sull'amministratore di WP contiene poche informazioni.
  2. In WP non esiste alcuna pagina di profilo pubblica: author.phpnon è una pagina di profilo.
  3. Oltre alla pagina del profilo, probabilmente avrete bisogno di ciclo attraverso il personale, e, naturalmente, si può usare WP_User_Queryper fare questo, ma isolando il personale da parte degli utenti che devono essere nascosti può essere un po 'difficile: non c'è tassonomia degli utenti e utilizzando ruoli utente può generare problemi se si desidera assegnare il ruolo pubblico a qualsiasi utente che non deve essere pubblicamente visibile.

Fortunatamente questi problemi non sono veri problemi e possono essere risolti facilmente. Il flusso di lavoro che suggerisco è:

  1. Crea un nuovo ruolo utente. È possibile clonare le funzionalità da un ruolo standard, ma creare un ruolo e isolare il personale dagli altri utenti sarà semplicissimo.
  2. Aggiungi campi personalizzati per i profili utente e inserisci tutte le informazioni che desideri.
  3. Creare un modello di pagina che gestirà il ciclo utente e il profilo utente. Come? Guarda il punto 4.
  4. Crea un endpoint di riscrittura. In questo modo un URL simile example.com/staffchiamerà una pagina (quella a cui assegni il modello creato su 3.) e un URL simile example.com/staff/user/nicknamechiamerà la stessa pagina, ma passa la query var usercon valore nicknameche puoi usare nella pagina per mostrare all'utente profilo.

1., 2. e 4. possono essere facilmente eseguiti in un plugin. Ti darò le ossa di questo plugin, che dovrebbe essere migliorato:

<?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' );

Il plugin fa esattamente quello che ho detto. Per quanto riguarda l'aggiunta di campi personalizzati per i profili utente, ad esempio, ho aggiunto solo 3 campi. Uno di questi è destinato all'uso per un'immagine dell'utente e accetta l'ID di un allegato. Naturalmente nel mondo reale è meglio chiamare l'autore del caricamento multimediale e lasciare che l'utente scelga di caricare un'immagine, ma questo non rientra nell'ambito di questa risposta ...

Dopo che il plug-in è stato salvato e attivato, dobbiamo creare il modello di pagina, creare una pagina e assegnare quel modello. Ancora una volta, posterò qui una prova di concetto per il modello:

<?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(); ?>

Ora crea una pagina e assegna questo modello. Quindi assegnare il ruolo utente 'staff' al proprio staff e riempire i profili.

Come tocco finale, nel tuo author.phppuoi aggiungere, probabilmente nell'intestazione, qualcosa del genere:

<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>

È tutto. Provalo, miglioralo e divertiti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.