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:
- La página de perfil predeterminada en el administrador de WP tiene poca información.
- En WP no hay ninguna página de perfil pública:
author.php
no es una página de perfil.
- 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:
- 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.
- Agregue campos personalizados para los perfiles de usuario y ponga toda la información que desee.
- Cree una plantilla de página que maneje el bucle de usuario y el perfil de usuario. ¿Cómo? Mira el punto 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.