¿Tipo de publicación personalizada para 'personal' en lugar de usar perfiles de usuario de wordpress?

11

Un escenario que sigo encontrando es donde una organización puede tener varios empleados para los que quiero tener algún tipo de listado y una página de perfil única con información biográfica.

Por lo general, crearía un tipo de publicación personalizada para el personal y tal vez una taxonomía personalizada si fuera necesario.

Pero ahora me pregunto si podría no ser óptimo usar el tipo de publicación "usuario" incorporado en Wordpress. Me doy cuenta de que puedo personalizar los campos de perfil de usuario, mostrar listas de usuarios, perfiles individuales, etc. Creo que también son posibles taxonomías personalizadas.

¿Hay una mejor práctica aquí?

Ahora tengo un caso en el que todo el personal también está escribiendo publicaciones de blog con su propio nombre y, por lo tanto, tengo una cuenta de usuario de todos modos y pensé que tal vez sea mejor que esté desarrollando sus perfiles de usuario y trabajando con el autor. php en lugar de usar el tipo de publicación personalizada de 'staff'.

Por ahora he ido con el CPT y he usado el complemento de Posts 2 Publicaciones para asociar su publicación de "personal" con su cuenta de "usuario" y, por lo tanto, crear listas de sus publicaciones de blog en su única página de personal.

Se agradece cualquier idea sobre la mejor manera de implementar esto en wordpress.

    
pregunta bongoman 18.06.2013 - 00:06

1 respuesta

15

Si las personas que desea mostrar públicamente en un sitio son usuarios , es decir, tienen una cuenta y escriben publicaciones, en mi opinión, es mucho mejor utilizar la funcionalidad de usuario de WordPress: toda la información que pondría en un CPT también se puede colocar en los metadatos del usuario, y crear usuarios es obligatorio (tienen que iniciar sesión), mientras que se puede evitar crear un CPT y, para mí, es redundante.

Sin embargo, sé que usar un CPT puede ser más simple , por algunas razones:

  1. La página de perfil predeterminada en el administrador de WP tiene poca información.
  2. En WP no hay ninguna página de perfil pública: author.php no es una página de perfil.
  3. Además de la página de perfil, es probable que desee recorrer a través del personal y, por supuesto, puede usar WP_User_Query para hacer esto, pero aislar al personal de los usuarios que deben estar ocultos puede ser un poco difícil: no hay taxonomía de usuario y el uso de roles de usuario puede generar problemas si desea asignar el rol público a cualquier usuario que no debe ser visible públicamente.

Afortunadamente, estos problemas no son problemas reales y se pueden resolver fácilmente. El flujo de trabajo que sugiero es:

  1. Crea una nueva función de usuario. Puede clonar capacidades de una función estándar, pero crear una función y aislar al personal de otros usuarios será muy fácil.
  2. Agregue campos personalizados para los perfiles de usuario y ponga toda la información que desee.
  3. Cree una plantilla de página que maneje el bucle de usuario y el perfil de usuario. ¿Cómo? Mira el punto 4.
  4. Crea un punto final de reescritura. De esta manera, una URL como example.com/staff llamará a una página (a la que asigna la plantilla creada en 3.) y una URL como example.com/staff/user/nickname llamará a la misma página, pero pasará la consulta var user con el valor nickname que puede usar en la página para mostrar el perfil de usuario.

1., 2. y 4. se pueden hacer fácilmente en un complemento. Te daré los huesos de este complemento, que deberían mejorarse:

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

El complemento hace exactamente lo que dije. En cuanto a la adición de campos personalizados para los perfiles de usuario, como ejemplo, agregué solo 3 campos. Uno de ellos está destinado a ser utilizado para una imagen de usuario y acepta la ID de un archivo adjunto. Por supuesto, en el mundo real es mejor llamar al cargador de medios y dejar que el usuario elija subir una imagen, pero esto no está en el alcance de esta respuesta ...

Después de guardar y activar el complemento, tenemos que crear la plantilla de página, crear una página y asignar esa plantilla. Una vez más, publicaré aquí una prueba de concepto para la plantilla:

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

Ahora crea una página y asigna esta plantilla. Luego, asigne el rol de "personal" a su personal y complete los perfiles.

Como toque final, en su author.php puede agregar, probablemente en el encabezado, algo como esto:

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

Eso es todo. Pruébalo, mejora y diviértete con él.

    
respondido por el gmazzap 19.08.2013 - 08:13

Lea otras preguntas en las etiquetas