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

13

Um cenário que eu sempre encontro é onde uma organização pode ter várias equipes para as 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 o ideal usar o tipo de postagem "usuário" interno no Wordpress. Percebo que posso personalizar os campos do perfil do usuário, exibir listagens de usuários, perfis únicos, etc. Também é possível taxonomias personalizadas.

Existe uma prática recomendada aqui?

Agora, tenho um caso em que todos os funcionários também escrevem postagens de blog com seu próprio nome e, portanto, têm uma conta de usuário, e passou pela minha cabeça que talvez seja melhor apenas detalhar seus perfis de usuário e trabalhar com author.php em vez de usando o tipo de postagem personalizada de 'equipe'.

Por enquanto, eu uso o CPT e utilizo o plug-in Posts 2 Posts para associar a postagem "staff" à conta "user" e, assim, criar listagens das postagens do blog em uma única página da equipe.

Qualquer opinião sobre a melhor forma de implementar isso no wordpress é apreciada.

bongoman
fonte

Respostas:

17

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

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

  1. A página de perfil padrão no administrador do WP possui poucas informações.
  2. No WP, não existe uma página de perfil público: author.phpnão é uma página de perfil.
  3. Além da página de perfil, você provavelmente vai querer ciclo através de pessoal, e é claro que você pode usar WP_User_Querypara fazer isso, mas isolando o pessoal dos usuários que devem ser escondidos pode ser um pouco difícil: não há nenhuma taxonomia de usuário e usando funções de usuário pode gere problemas se desejar atribuir a função pública a qualquer usuário que não deva ser visível publicamente.

Felizmente esses problemas não são reais problemas e pode ser resolvido facilmente. O fluxo de trabalho que 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 que você deseja.
  3. Crie um modelo de página que manipule o loop do usuário e o perfil do usuário. Quão? Veja o ponto 4.
  4. Crie um ponto final de reescrita. Dessa forma, um URL como example.com/staffchamará uma página (a que você atribuiu o modelo criado em 3.) e um URL como example.com/staff/user/nicknamechamará a mesma página, mas passará a consulta var usercom o valor nicknameque você pode usar na página para mostrar ao usuário perfil.

1., 2. e 4. podem ser facilmente executados em um plugin. Vou dar-lhe os ossos deste plugin, que deve ser melhorado:

<?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. Em relação à adição de campos personalizados para perfis de usuário, como exemplo, adicionei apenas 3 campos. Um deles se destina a ser usado para uma imagem de usuário e aceita o ID de um anexo. Obviamente, no mundo real, é melhor chamar o uploader de mídia e permitir que o usuário opte por enviar uma imagem, mas isso não está no escopo desta resposta ...

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

<?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 este modelo. Em seguida, atribua a função de usuário 'equipe' à sua equipe e preencha os perfis.

Como toque final, author.phpvocê pode adicionar, provavelmente no cabeçalho, algo como isto:

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

gmazzap
fonte