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:
- La página de perfil predeterminada en el administrador de WP tiene poca información.
- En WP no hay una página de perfil público:
author.php
no es una página de perfil.
- 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_Query
para 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:
- 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.
- Agregue campos personalizados para los perfiles de usuario y coloque toda la información que desee.
- Cree una plantilla de página que manejará 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 (la que le asignó 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 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.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, mejóralo y diviértete con él.