ประเภทโพสต์ที่กำหนดเองสำหรับ 'พนักงาน' เมื่อเทียบกับการใช้โปรไฟล์ผู้ใช้ WordPress?


13

สถานการณ์ที่ฉันพบเจอคือองค์กรอาจมีพนักงานหลายคนที่ฉันต้องการมีรายชื่อและหน้าโปรไฟล์เดียวพร้อมข้อมูลชีวประวัติ

โดยทั่วไปฉันจะสร้างประเภทโพสต์ที่กำหนดเองสำหรับพนักงานและอาจอนุกรมวิธานที่กำหนดเองถ้าจำเป็น

แต่ตอนนี้ฉันสงสัยว่ามันอาจไม่เหมาะสมที่จะใช้โพสต์ "ผู้ใช้" ในตัวใน Wordpress ฉันรู้ว่าฉันสามารถปรับแต่งฟิลด์โปรไฟล์ผู้ใช้แสดงรายชื่อผู้ใช้โปรไฟล์เดียว ฯลฯ taxonomies ที่กำหนดเองก็เป็นไปได้เช่นกันฉันก็เชื่อ

มีวิธีปฏิบัติที่ดีที่สุดที่นี่หรือไม่?

ตอนนี้ฉันมีกรณีที่พนักงานทุกคนกำลังเขียนโพสต์บล็อกภายใต้ชื่อของตัวเองและมีบัญชีผู้ใช้อยู่แล้วและมันก็ทำให้ฉันคิดว่าฉันดีกว่าแค่ใช้โปรไฟล์ผู้ใช้และทำงานกับ author.php แทน ใช้ประเภทโพสต์ที่กำหนดเองของ 'พนักงาน'

ตอนนี้ฉันไปกับ CPT และใช้ปลั๊กอินโพสต์ 2 โพสต์เพื่อเชื่อมโยงโพสต์ "พนักงาน" กับบัญชี "ผู้ใช้" ของพวกเขาและสร้างรายการของโพสต์บล็อกของพวกเขาในหน้าพนักงานเดียว

ความคิดใด ๆ เกี่ยวกับวิธีที่ดีที่สุดในการใช้งานใน wordpress คือความนิยม

คำตอบ:


17

หากคนที่คุณต้องการแสดงต่อสาธารณะบนเว็บไซต์คือผู้ใช้นั่นคือมีบัญชีและเขียนโพสต์ในความคิดของฉันมันดีกว่าที่จะใช้ฟังก์ชั่นผู้ใช้ WordPress: ข้อมูลทั้งหมดที่คุณใส่ใน CPT ยังสามารถใส่ข้อมูลเมตาของผู้ใช้ และการสร้างผู้ใช้จำเป็นต้องมี (พวกเขาต้องเข้าสู่ระบบ) ในขณะที่การสร้าง CPT สามารถหลีกเลี่ยงได้และสำหรับฉันนั้นซ้ำซ้อน

อย่างไรก็ตามฉันรู้ว่าการใช้ CPT นั้นง่ายกว่าด้วยเหตุผลบางประการ:

  1. หน้าโปรไฟล์เริ่มต้นบนผู้ดูแลระบบ WP มีข้อมูลน้อย
  2. ใน WP ไม่มีหน้าโปรไฟล์สาธารณะเลย: author.phpไม่ใช่หน้าโปรไฟล์
  3. นอกเหนือจากหน้าโปรไฟล์คุณอาจต้องการวนพนักงานและแน่นอนคุณสามารถใช้WP_User_Queryในการทำเช่นนี้ แต่การแยกพนักงานออกจากผู้ใช้ที่ต้องซ่อนอาจเป็นเรื่องยากเล็กน้อย: ไม่มี taxonomy ของผู้ใช้และการใช้บทบาทผู้ใช้สามารถ สร้างปัญหาหากคุณต้องการกำหนดบทบาทสาธารณะให้กับผู้ใช้ที่ต้องไม่เปิดเผยต่อสาธารณะ

โชคดีที่ปัญหาเหล่านี้ไม่ใช่ปัญหาจริงและสามารถแก้ไขได้อย่างง่ายดาย เวิร์กโฟลว์ที่ฉันแนะนำคือ:

  1. สร้างบทบาทผู้ใช้ใหม่ คุณสามารถคัดลอกความสามารถจากบทบาทมาตรฐาน แต่การสร้างบทบาทและแยกพนักงานออกจากผู้ใช้รายอื่นนั้นจะง่ายมาก
  2. เพิ่มฟิลด์ที่กำหนดเองสำหรับโปรไฟล์ผู้ใช้และใส่ข้อมูลทั้งหมดที่คุณต้องการ
  3. สร้างเทมเพลตหน้าที่จะจัดการห่วงผู้ใช้และโปรไฟล์ผู้ใช้ อย่างไร? ดูจุดที่ 4
  4. สร้างจุดปลายเขียนใหม่ ด้วยวิธีนี้ URL เช่นexample.com/staffนี้จะเรียกหน้าเว็บ (หน้าเว็บที่คุณกำหนดแม่แบบที่สร้างขึ้นบน 3) และ URL เช่นexample.com/staff/user/nicknameนี้จะเรียกหน้าเว็บเดียวกัน แต่ส่งผ่านแบบสอบถามคิวรีuserด้วยค่าnicknameที่คุณสามารถใช้ในหน้าเว็บเพื่อแสดงผู้ใช้ ข้อมูลส่วนตัว.

1. , 2. และ 4. สามารถทำได้อย่างง่ายดายในปลั๊กอิน ฉันจะให้คุณกระดูกของปลั๊กอินนี้ที่ควรปรับปรุง:

<?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' );

ปลั๊กอินทำในสิ่งที่ฉันพูด เกี่ยวกับการเพิ่มฟิลด์ที่กำหนดเองสำหรับโปรไฟล์ผู้ใช้เป็นตัวอย่างฉันเพิ่มเพียง 3 ฟิลด์ หนึ่งในนั้นมีวัตถุประสงค์เพื่อใช้สำหรับอิมเมจผู้ใช้และยอมรับ ID ของสิ่งที่แนบ แน่นอนว่าในโลกแห่งความเป็นจริงมันจะเป็นการดีกว่าที่จะโทรหาผู้อัปโหลดสื่อและให้ผู้ใช้เลือกที่จะอัพโหลดรูปภาพ แต่นี่ไม่ได้อยู่ในขอบเขตของคำตอบนี้ ...

หลังจากบันทึกและเปิดใช้งานปลั๊กอินแล้วเราจะต้องสร้างเทมเพลตหน้าสร้างหน้าและกำหนดเทมเพลตนั้น อีกครั้งฉันจะโพสต์ที่นี่เพื่อพิสูจน์แนวคิดสำหรับแม่แบบ:

<?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(); ?>

ตอนนี้สร้างหน้าและกำหนดแม่แบบนี้ จากนั้นกำหนดบทบาทผู้ใช้ 'พนักงาน' ให้กับพนักงานของคุณและกรอกข้อมูลโปรไฟล์

ในการสัมผัสขั้นสุดท้ายauthor.phpคุณสามารถเพิ่มในส่วนหัวได้ดังนี้:

<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>

นั่นคือทั้งหมดที่ ทดสอบปรับปรุงและสนุกกับมัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.