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

13

Un escenario que sigo encontrando es donde una organización podría tener varios miembros del personal para quienes quiero tener algún tipo de listado y una página de perfil único con información biográfica.

Por lo general, crearía un tipo de publicación personalizado 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 listados de usuarios, perfiles únicos, etc. También creo que son posibles las 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 se me ocurrió que tal vez sea mejor simplemente desarrollar sus perfiles de usuario y trabajar con author.php en lugar de utilizando el tipo de publicación personalizada de "personal".

Por ahora he estado usando el CPT y usando el complemento Posts 2 Posts para asociar su publicación "staff" con su cuenta "user" y así crear listados de sus publicaciones de blog en su página personal única.

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

bongoman
fuente

Respuestas:

17

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 usar la funcionalidad de usuario de WordPress: toda la información que pondría en un CPT también se puede poner en los metadatos del usuario , y la creación de usuarios es obligatoria (tienen que iniciar sesión), mientras que la creación de un CPT se puede evitar 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 una página de perfil público: author.phpno es una página de perfil.
  3. Además de la página de perfil, es probable que desee bucle a través del personal, y por supuesto se puede utilizar WP_User_Querypara hacer esto, pero el aislamiento del personal de los usuarios que deben ser escondidos puede ser un poco difícil: no hay taxonomía de usuario y el uso de las funciones 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 verdaderos problemas y pueden resolverse fácilmente. El flujo de trabajo que sugiero es:

  1. Crea una nueva función de usuario. Puede clonar capacidades desde un rol estándar, pero crear un rol y aislar al personal de otros usuarios será muy fácil.
  2. Agregue campos personalizados para los perfiles de usuario y coloque toda la información que desee.
  3. Cree una plantilla de página que manejará 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/staffllamará a una página (la que le asignó la plantilla creada en 3.) y una URL como example.com/staff/user/nicknamellamará a la misma página, pero pasará la consulta var usercon el valor nicknameque puede usar en la página para mostrar al usuario perfil.

1., 2. y 4. se pueden hacer fácilmente en un complemento. Te daré los huesos de este complemento, que debería 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 agregar campos personalizados para 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 identificación de un archivo adjunto. Por supuesto, en el mundo real es mejor llamar al cargador de medios y dejar que el usuario elija cargar 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. Nuevamente, 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 cree una página y asigne esta plantilla. Luego asigne el rol de usuario 'personal' a su personal y complete los perfiles.

Como toque final, en su author.phppuede 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, mejóralo y diviértete con él.

gmazzap
fuente