Niestandardowy typ postu dla „personelu” czy przy użyciu profili użytkowników wordpress?

13

Wciąż spotykam się ze scenariuszem, w którym organizacja może zatrudniać kilku pracowników, dla których chcę mieć jakiś wykaz i jedną stronę profilu z informacjami biograficznymi.

Zazwyczaj tworzyłem niestandardowy typ postu dla pracowników i ewentualnie niestandardową taksonomię w razie potrzeby.

Ale teraz zastanawiam się, czy użycie wbudowanego typu postu „user” w Wordpress może nie być optymalne. Zdaję sobie sprawę, że mogę dostosować pola profilu użytkownika, wyświetlić listę użytkowników, pojedyncze profile itp. Uważam, że niestandardowe taksonomie są również możliwe.

Czy jest tutaj najlepsza praktyka?

Mam teraz przypadek, w którym wszyscy pracownicy również piszą posty na blogach pod własnym nazwiskiem, a więc i tak mam konto użytkownika, i przyszło mi do głowy, że może lepiej mi będzie po prostu rozwinąć profile użytkowników i pracować z autor.php zamiast przy użyciu niestandardowego typu „personelu”.

Na razie korzystam z CPT i używam wtyczki Posts 2 Posts do powiązania ich postów „personelu” z kontem „użytkownika”, a tym samym tworzenia list ich postów na blogu na stronie pojedynczego personelu.

Doceniamy wszelkie przemyślenia na temat tego, jak najlepiej wdrożyć to w wordpress.

bongoman
źródło

Odpowiedzi:

17

Jeśli osoby, które chcesz pokazywać publicznie w witrynie, są użytkownikami , tj. Mają konto i piszą posty, moim zdaniem znacznie lepiej jest korzystać z funkcji użytkownika WordPress: wszystkie informacje, które umieścisz w CPT, można również umieścić w metadanych użytkowników , a tworzenie użytkowników jest obowiązkowe (muszą się zalogować), a tworzenia CPT można uniknąć, a dla mnie jest ono zbędne.

Wiem jednak, że korzystanie z CPT może być prostsze z kilku powodów:

  1. Domyślna strona profilu administratora WP ma niewiele informacji.
  2. W WP w ogóle nie ma publicznej strony profilu: author.phpnie jest to strona profilu.
  3. Oprócz strony profilu, prawdopodobnie chcesz pętli przez pracowników, i oczywiście można wykorzystać WP_User_Querydo tego, ale izolowanie pracowników od użytkowników, które muszą być ukryte mogą być trochę trudne: nie ma taksonomia użytkownika i za pomocą ról użytkownik może generuj problemy, jeśli chcesz przypisać rolę publiczną dowolnemu użytkownikowi, który nie może być publicznie widoczny.

Na szczęście problemy te nie są prawdziwymi problemami i można je łatwo rozwiązać. Przepływ pracy, który sugeruję to:

  1. Utwórz nową rolę użytkownika. Możesz sklonować funkcje ze standardowej roli, ale tworzenie roli i izolowanie personelu od innych użytkowników będzie super łatwe.
  2. Dodaj niestandardowe pola dla profili użytkowników i umieść wszystkie potrzebne informacje.
  3. Utwórz szablon strony, który będzie obsługiwał pętlę użytkownika i profil użytkownika. W jaki sposób? Spójrz na punkt 4.
  4. Utwórz przepisany punkt końcowy. W ten sposób URL podobny example.com/staffwywoła stronę (ten, do którego przypisałeś szablon utworzony w 3.), a URL podobny example.com/staff/user/nicknamewywoła tę samą stronę, ale przekaże zapytanie var usero wartości nickname, której możesz użyć na stronie, aby wyświetlić użytkownika profil.

1., 2. i 4. można łatwo zrobić we wtyczce. Dam ci kości tej wtyczki, które należy poprawić:

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

Wtyczka robi dokładnie to, co powiedziałem. Jeśli chodzi o dodawanie niestandardowych pól dla profili użytkowników, na przykład dodałem tylko 3 pola. Jeden z nich jest przeznaczony do użycia dla obrazu użytkownika i akceptuje identyfikator załącznika. Oczywiście w prawdziwym świecie lepiej jest zadzwonić do osoby przesyłającej media i pozwolić użytkownikowi wybrać przesłanie obrazu, ale to nie wchodzi w zakres tej odpowiedzi ...

Po zapisaniu i aktywacji wtyczki musimy utworzyć szablon strony, stronę i przypisać ten szablon. Ponownie opublikuję tutaj dowód koncepcji szablonu:

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

Teraz utwórz stronę i przypisz ten szablon. Następnie przypisz rolę użytkownika „personel” do swoich pracowników i wypełnij profile.

Na koniec author.phpmożesz dodać, prawdopodobnie w nagłówku, coś takiego:

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

To wszystko. Przetestuj, popraw i baw się dobrze.

gmazzap
źródło