Tipo de postagem personalizada para 'equipe' versus uso de perfis de usuário do wordpress?

11

Um cenário que eu sempre encontro é onde uma organização pode ter vários funcionários para os quais eu quero ter algum tipo de listagem e uma única página de perfil com informações biográficas.

Normalmente, eu criaria um tipo de postagem personalizado para a equipe e talvez uma taxonomia personalizada, se necessário.

Mas agora estou me perguntando se pode não ser ideal usar o tipo de postagem "usuário" interno no Wordpress. Eu percebo que posso personalizar os campos do perfil do usuário, exibir listas de usuários, perfis individuais, etc. Acredito que também são possíveis taxonomias personalizadas.

Existe uma prática recomendada aqui?

Eu tenho um caso agora em que todos os funcionários também escrevem posts em seu próprio nome e têm uma conta de usuário de qualquer maneira e me passou pela cabeça que talvez eu esteja melhor apenas desenvolvendo seus perfis de usuário e trabalhando com o autor. php em vez de usar o tipo de postagem personalizado de 'staff'.

Por enquanto venho com o CPT e usando o plugin Posts 2 Posts para associar sua postagem "staff" com sua conta de "usuário" e, assim, criar listagens de suas postagens em sua única página pessoal.

Qualquer opinião sobre a melhor forma de implementar isso no wordpress é bem-vinda.

    
por bongoman 18.06.2013 / 00:06

1 resposta

15

Se as pessoas que você deseja mostrar publicamente em um site são usuários , ou seja, ter uma conta e escrever postagens, na minha opinião é muito melhor usar a funcionalidade do usuário do WordPress: todas as informações em um CPT também pode ser colocado em metadados do usuário, e a criação de usuários é obrigatória (eles precisam fazer o login), enquanto a criação de um CPT pode ser evitada e, para mim, é redundante.

No entanto, sei que usar um CPT pode ser mais simples , por alguns motivos:

  1. Página de perfil padrão no administrador do WP tem poucas informações.
  2. No WP, não há página de perfil público: author.php não é uma página de perfil.
  3. Além da página de perfil, você provavelmente desejará loop através da equipe, e é claro que você pode usar WP_User_Query para fazer isso, mas isolar funcionários de usuários que devem estar ocultos pode ser um pouco difícil: não há taxonomia de usuário e o uso de funções de usuário pode gerar problemas se você quiser atribuir a função pública a qualquer usuário que não deva ser publicamente visível.

Felizmente, esses problemas não são problemas reais e podem ser resolvidos facilmente. O fluxo de trabalho que eu sugiro é:

  1. Crie uma nova função de usuário. Você pode clonar recursos de uma função padrão, mas criar uma função e isolar a equipe de outros usuários será super fácil.
  2. Adicione campos personalizados para perfis de usuário e coloque todas as informações desejadas.
  3. Crie um modelo de página que manipule o loop do usuário e o perfil do usuário. Como? Olhe para o ponto 4.
  4. Crie um ponto de extremidade de reescrita. Dessa forma, um URL como example.com/staff chamará uma página (aquela que você atribuiu ao modelo criado em 3.) e um URL como example.com/staff/user/nickname chamará a mesma página, mas passará a consulta var user com valor nickname que você pode usar na página para mostrar o perfil do usuário.

1, 2. e 4. pode ser facilmente feito em um plugin. Eu vou te dar os bones deste plugin, que devem ser melhorados:

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

O plugin faz exatamente o que eu disse. Quanto à adição de campos personalizados para perfis de usuário, por exemplo, adicionei apenas 3 campos. Um deles é destinado a ser usado para uma imagem de usuário e aceita o ID de um anexo. É claro que no mundo real é melhor ligar para o carregador de mídia e deixar que o usuário escolha enviar uma imagem, mas isso não está no escopo dessa resposta ...

Depois que o plug-in é salvo e ativado, precisamos criar o modelo de página, criar uma página e atribuir esse modelo. Mais uma vez, vou postar aqui uma prova de conceito para o template:

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

Agora crie uma página e atribua esse modelo. Em seguida, atribua a função de usuário "equipe" à sua equipe e preencha os perfis.

Como toque final, no seu author.php você pode adicionar, provavelmente no cabeçalho, algo assim:

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

Isso é tudo. Teste, melhore e divirta-se com isso.

    
por gmazzap 19.08.2013 / 08:13