Nếu những người bạn muốn hiển thị công khai trên một trang web là người dùng , tức là có tài khoản và viết bài đăng, theo tôi, tốt hơn hết là sử dụng chức năng người dùng WordPress: tất cả thông tin bạn sẽ đưa vào CPT cũng có thể được đưa vào siêu dữ liệu người dùng và việc tạo người dùng là bắt buộc (họ phải đăng nhập), trong khi việc tạo CPT có thể tránh được và đối với tôi, là không cần thiết.
Tuy nhiên, tôi biết rằng sử dụng CPT có thể đơn giản hơn , vì một số lý do:
- Trang hồ sơ mặc định trên WP admin có ít thông tin.
- Trong WP không có trang hồ sơ công khai nào cả:
author.php
không phải là trang hồ sơ.
- Ngoài trang hồ sơ, bạn có thể muốn lặp qua nhân viên, và tất nhiên bạn có thể sử dụng
WP_User_Query
để làm điều này, nhưng cách ly nhân viên khỏi người dùng phải ẩn có thể hơi khó: không có phân loại người dùng và sử dụng vai trò người dùng có thể tạo ra vấn đề nếu bạn muốn gán công vai trò đối với bất kỳ người dùng mà không phải hiển thị công khai.
May mắn những vấn đề này không phải là thật khó khăn và có thể được giải quyết một cách dễ dàng. Quy trình công việc tôi đề xuất là:
- Tạo một vai trò người dùng mới. Bạn có thể sao chép các khả năng từ một vai trò tiêu chuẩn, nhưng tạo ra một vai trò và cách ly nhân viên khỏi những người dùng khác, sẽ cực kỳ dễ dàng.
- Thêm các trường tùy chỉnh cho hồ sơ người dùng và đặt tất cả thông tin bạn muốn.
- Tạo một mẫu trang sẽ xử lý vòng lặp người dùng và hồ sơ người dùng. Làm sao? Nhìn vào điểm 4.
- Tạo một điểm cuối viết lại. Theo cách này, một URL like
example.com/staff
sẽ gọi một trang (cái mà bạn chỉ định mẫu được tạo trên 3.) và một URL giống như example.com/staff/user/nickname
sẽ gọi cùng một trang, nhưng chuyển var truy vấn user
với giá trị nickname
mà bạn có thể sử dụng trong trang để hiển thị cho người dùng Hồ sơ.
1., 2. và 4. có thể dễ dàng thực hiện trong một plugin. Tôi sẽ cung cấp cho bạn xương của plugin này, cần được cải thiện:
<?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' );
Các plugin làm chính xác những gì tôi nói. Về việc thêm các trường tùy chỉnh cho hồ sơ người dùng, làm ví dụ, tôi chỉ thêm 3 trường. Một trong số chúng được dự định sẽ được sử dụng cho hình ảnh người dùng và chấp nhận ID của tệp đính kèm. Tất nhiên trong thế giới thực, tốt hơn là gọi trình tải lên phương tiện và cho phép người dùng chọn tải lên hình ảnh, nhưng điều này không nằm trong phạm vi của câu trả lời này ...
Sau khi plugin được lưu và kích hoạt, chúng ta phải tạo mẫu trang, tạo trang và gán mẫu đó. Một lần nữa, tôi sẽ đăng ở đây một bằng chứng về khái niệm cho mẫu:
<?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(); ?>
Bây giờ tạo một trang và gán mẫu này. Sau đó chỉ định vai trò người dùng 'nhân viên' cho nhân viên của bạn và điền vào hồ sơ.
Như một liên lạc cuối cùng, trong author.php
bạn có thể thêm, có thể trong tiêu đề, một cái gì đó như thế này:
<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>
Đó là tất cả. Kiểm tra nó, cải thiện nó và vui chơi với nó.