Jika orang yang ingin Anda perlihatkan kepada publik di situs adalah pengguna , yaitu memiliki akun dan menulis posting, menurut pendapat saya, jauh lebih baik menggunakan fungsionalitas pengguna WordPress: semua informasi yang Anda masukkan ke dalam CPT juga dapat dimasukkan ke dalam metadata pengguna , dan membuat pengguna adalah wajib (mereka harus masuk), sementara membuat CPT dapat dihindari dan, bagi saya, berlebihan.
Namun, saya tahu bahwa menggunakan CPT bisa lebih sederhana , karena beberapa alasan:
- Halaman profil default pada admin WP memiliki sedikit informasi.
- Di WP tidak ada halaman profil publik sama sekali:
author.php
bukan halaman profil.
- Selain halaman profil, Anda mungkin ingin mengulang -ulang staf, dan tentu saja Anda dapat menggunakannya
WP_User_Query
untuk melakukan ini, tetapi mengisolasi staf dari pengguna yang harus disembunyikan bisa sedikit sulit: tidak ada taksonomi pengguna dan menggunakan peran pengguna dapat menghasilkan masalah jika Anda ingin menetapkan peran publik untuk setiap pengguna yang tidak boleh terlihat oleh publik.
Untungnya masalah ini bukan masalah nyata dan bisa diselesaikan dengan mudah. Alur kerja yang saya sarankan adalah:
- Buat peran pengguna baru. Anda dapat mengkloning kemampuan dari peran standar, tetapi membuat peran, dan mengisolasi staf dari pengguna lain, akan sangat mudah.
- Tambahkan bidang khusus untuk profil pengguna, dan letakkan semua informasi yang Anda inginkan.
- Buat templat halaman yang akan menangani loop pengguna dan profil pengguna. Bagaimana? Lihat poin 4.
- Buat titik akhir penulisan ulang. Dengan cara ini URL seperti
example.com/staff
akan memanggil halaman (yang Anda tentukan template dibuat pada 3.) dan URL seperti example.com/staff/user/nickname
akan memanggil halaman yang sama, tetapi meneruskan kueri var user
dengan nilai nickname
yang dapat Anda gunakan di halaman untuk menunjukkan kepada pengguna Profil.
1., 2. dan 4. dapat dengan mudah dilakukan dalam sebuah plugin. Saya akan memberi Anda tulang - tulang dari plugin ini, yang harus ditingkatkan:
<?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' );
Plugin melakukan apa yang saya katakan. Mengenai menambahkan bidang khusus untuk profil pengguna, sebagai contoh, saya menambahkan hanya 3 bidang. Salah satunya dimaksudkan untuk digunakan untuk gambar pengguna dan menerima ID lampiran. Tentu saja di dunia nyata lebih baik memanggil pengunggah media dan membiarkan pengguna memilih untuk mengunggah gambar, tetapi ini bukan dalam cakupan jawaban ini ...
Setelah plugin disimpan dan diaktifkan, kita harus membuat templat halaman, membuat halaman, dan menetapkan templat itu. Sekali lagi, saya akan memposting di sini bukti konsep untuk templat:
<?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(); ?>
Sekarang buat halaman dan tetapkan template ini. Kemudian tetapkan 'staf' peran pengguna untuk staf Anda dan isi profil.
Sebagai sentuhan terakhir, di Anda author.php
Anda dapat menambahkan, mungkin di header, sesuatu seperti ini:
<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>
Itu saja. Uji, tingkatkan, dan bersenang-senanglah.