Спеціальний тип публікації для "персоналу" порівняно з використанням профілів користувачів Wordpress?


13

Сценарій, який я постійно зустрічаю, - це коли організація може мати декілька співробітників, для яких я хочу мати певний список та одну сторінку профілю з біографічною інформацією.

Як правило, я б створив спеціальний тип пошти для персоналу, а можливо, і власну таксономію, якщо це потрібно.

Але зараз мені цікаво, чи не може бути оптимальним використання вбудованого типу "користувача" у Wordpress. Я розумію, що я можу налаштувати поля профілю користувачів, відобразити списки користувачів, окремі профілі тощо. Можливі й власні таксономії.

Чи є тут найкраща практика?

Зараз у мене є випадок, коли всі співробітники також пишуть дописи в блозі під власним іменем, і так чи інакше мають обліковий запис користувача, і мені зрозуміло, що, можливо, мені краще просто розгорнути їхні профілі користувачів і працювати з author.php, а не використовуючи спеціальний тип публікації "персонал".

Наразі я працюю з CPT і використовую плагін Posts 2 Posts, щоб пов’язати свої "співробітники" з їх обліковим записом "користувача" і тим самим створити списки своїх публікацій в блозі на їхній єдиній сторінці співробітників.

Будь-яка думка про те, як найкраще реалізувати це в wordpress, оцінена.

Відповіді:


17

Якщо люди, які ви хочете публічно показувати на сайті, є користувачами , тобто мають обліковий запис і пишуть публікації, на мою думку, набагато краще використовувати функцію користувача WordPress: вся інформація, яку ви помістили в CPT, також може бути поміщена в метадані користувача , а створення користувачів є обов'язковим (вони повинні увійти в систему), тоді як створення CPT можна уникнути, і для мене це зайве.

Однак я знаю, що використання CPT може бути простішим з певних причин:

  1. На сторінці профілю за замовчуванням у адміністратора WP мало інформації.
  2. У WP взагалі немає публічної сторінки профілю: author.phpце не сторінка профілю.
  3. У доповненні до сторінці профілю, ви , ймовірно , хочете , щоб петлі через співробітник, і, звичайно ж, ви можете використовувати , WP_User_Queryщоб зробити це, але ізолювати персонал від користувачів , які повинні бути заховані може бути трохи важко: немає користувачів систематики та використання користувальницьких ролей може створювати проблеми, якщо ви хочете призначити загальнодоступну роль будь-якому користувачеві, який не повинен бути загальнодоступним.

На щастя, ці проблеми не є справжніми проблемами, і їх можна легко вирішити. Я пропоную робочий процес:

  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 поля. Один з них призначений для використання для зображення користувача та приймає ідентифікатор вкладеного файлу. Звичайно, у реальному світі краще зателефонувати до медіа-завантажувача та дозволити користувачеві вибрати завантаження зображення, але це не входить у рамки цієї відповіді ...

Після збереження та активації плагіну нам потрібно створити шаблон сторінки, створити сторінку та призначити цей шаблон. Знову я опублікую тут доказ концепції для шаблону:

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

Це все. Випробуйте його, вдосконалюйте і отримуйте задоволення від цього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.