Loại bài đăng tùy chỉnh cho 'staff' so với sử dụng hồ sơ người dùng wordpress?


13

Một kịch bản tôi tiếp tục gặp phải là nơi một tổ chức có thể có một vài nhân viên mà tôi muốn có một danh sách và một trang hồ sơ với thông tin tiểu sử.

Thông thường tôi sẽ tạo một loại bài tùy chỉnh cho nhân viên và có thể phân loại tùy chỉnh nếu cần.

Nhưng bây giờ tôi tự hỏi nếu nó có thể không tối ưu để sử dụng loại bài đăng "người dùng" tích hợp trong Wordpress. Tôi nhận ra rằng tôi có thể tùy chỉnh các trường hồ sơ người dùng, hiển thị danh sách người dùng, hồ sơ đơn, v.v ... Tôi cũng có thể phân loại tùy chỉnh.

Có một thực hành tốt nhất ở đây?

Bây giờ tôi có một trường hợp tất cả các nhân viên cũng đang viết bài đăng trên blog dưới tên riêng của họ và vì vậy dù sao cũng có tài khoản người dùng và tôi nghĩ rằng có lẽ tốt hơn hết là tôi nên tìm hiểu hồ sơ người dùng của họ và làm việc với Author.php thay vì sử dụng loại bài tùy chỉnh của 'nhân viên'.

Hiện tại, tôi đã sử dụng CPT và sử dụng plugin Bài viết 2 để liên kết bài đăng "nhân viên" của họ với tài khoản "người dùng" của họ và từ đó tạo danh sách các bài đăng trên blog của họ trên trang nhân viên của họ.

Bất kỳ suy nghĩ về cách tốt nhất để thực hiện điều này trong wordpress được đánh giá cao.

Câu trả lời:


17

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:

  1. Trang hồ sơ mặc định trên WP admin có ít thông tin.
  2. Trong WP không có trang hồ sơ công khai nào cả: author.phpkhông phải là trang hồ sơ.
  3. 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à:

  1. 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.
  2. 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.
  3. 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.
  4. Tạo một điểm cuối viết lại. Theo cách này, một URL like example.com/staffsẽ 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/nicknamesẽ gọi cùng một trang, nhưng chuyển var truy vấn uservới giá trị nicknamemà 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.phpbạ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ó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.