Jenis posting khusus untuk 'staf' dibandingkan menggunakan profil pengguna wordpress?

13

Skenario yang terus saya temui adalah di mana sebuah organisasi mungkin memiliki beberapa staf yang ingin saya miliki semacam daftar dan satu halaman profil dengan informasi biografis.

Biasanya saya akan membuat jenis posting kustom untuk staf dan mungkin taksonomi kustom jika diperlukan.

Tapi sekarang saya bertanya-tanya apakah itu mungkin tidak optimal untuk menggunakan tipe posting "user" built-in di Wordpress. Saya menyadari bahwa saya dapat menyesuaikan bidang profil pengguna, menampilkan daftar pengguna, profil tunggal dll. Taksonomi kustom juga dimungkinkan.

Apakah ada praktik terbaik di sini?

Saya memiliki kasus sekarang di mana semua staf juga menulis posting blog dengan nama mereka sendiri dan memiliki akun pengguna dan terlintas dalam pikiran saya bahwa mungkin saya lebih baik hanya menyempurnakan profil pengguna mereka dan bekerja dengan author.php alih-alih menggunakan jenis pos khusus 'staf'.

Untuk saat ini saya telah menggunakan CPT dan menggunakan plugin Posting 2 Posting untuk mengaitkan posting "staf" mereka dengan akun "pengguna" mereka dan dengan demikian membuat daftar posting blog mereka pada halaman staf tunggal mereka.

Setiap pemikiran tentang cara terbaik untuk menerapkan ini di wordpress sangat dihargai.

bongoman
sumber

Jawaban:

17

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:

  1. Halaman profil default pada admin WP memiliki sedikit informasi.
  2. Di WP tidak ada halaman profil publik sama sekali: author.phpbukan halaman profil.
  3. Selain halaman profil, Anda mungkin ingin mengulang -ulang staf, dan tentu saja Anda dapat menggunakannya WP_User_Queryuntuk 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:

  1. Buat peran pengguna baru. Anda dapat mengkloning kemampuan dari peran standar, tetapi membuat peran, dan mengisolasi staf dari pengguna lain, akan sangat mudah.
  2. Tambahkan bidang khusus untuk profil pengguna, dan letakkan semua informasi yang Anda inginkan.
  3. Buat templat halaman yang akan menangani loop pengguna dan profil pengguna. Bagaimana? Lihat poin 4.
  4. Buat titik akhir penulisan ulang. Dengan cara ini URL seperti example.com/staffakan memanggil halaman (yang Anda tentukan template dibuat pada 3.) dan URL seperti example.com/staff/user/nicknameakan memanggil halaman yang sama, tetapi meneruskan kueri var userdengan nilai nicknameyang 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.phpAnda 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.

gmazzap
sumber