'직원'에 대한 사용자 정의 게시물 유형 대 워드 프레스 사용자 프로필 사용?


13

내가 계속 접할 수있는 시나리오는 조직에 여러 종류의 직원이 있고 정보가있는 단일 프로필 페이지와 목록이있는 직원이있을 수 있습니다.

일반적으로 직원에 대한 사용자 정의 게시물 유형을 작성하고 필요한 경우 사용자 정의 분류를 작성합니다.

그러나 지금은 Wordpress에서 내장 "사용자"게시물 유형을 사용하는 것이 최적이 아닌지 궁금합니다. 나는 사용자 프로파일 필드를 사용자 정의하고, 사용자 목록을 표시하고, 단일 프로파일 등을 사용자 정의 할 수 있다는 것을 알고 있습니다.

모범 사례가 있습니까?

모든 직원이 자신의 이름으로 블로그 게시물을 작성하고 어쨌든 사용자 계정을 가지고있는 경우가 있습니다. 어쩌면 사용자 프로필을 육성하고 author.php 대신 작업하는 것이 좋습니다. '직원'의 맞춤 게시물 유형을 사용합니다.

지금은 CPT를 사용하고 Posts 2 Posts 플러그인을 사용하여 "직원"게시물을 "사용자"계정과 연결하여 단일 직원 페이지에서 블로그 게시물 목록을 작성했습니다.

워드 프레스에서 이것을 구현하는 가장 좋은 방법에 대한 의견은 높이 평가됩니다.

답변:


17

당신이 사이트에 공개적으로 보여주고 싶은 사람들이 users 인 경우 , 즉 계정을 가지고 있고 글을 쓰는 경우, WordPress 사용자 기능을 사용하는 것이 훨씬 낫습니다. CPT에 넣은 모든 정보는 사용자 메타 데이터에도 저장 될 수 있습니다 , 사용자를 만드는 것은 필수 CPT를 작성하는 것은 나를 위해, 중복 회피 할 수 있지만, (그들은 로그인해야합니다).

그러나 CPT를 사용하는 것이 몇 가지 이유로 더 간단 하다는 것을 알고 있습니다 .

  1. WP 관리자의 기본 프로필 페이지에는 정보가 거의 없습니다.
  2. WP에는 공개 프로필 페이지 author.php가 전혀 없습니다. 프로필 페이지가 아닙니다.
  3. 프로필 페이지 외에도 직원 을 반복 하고 싶을 것 입니다. 물론 WP_User_Query이 작업을 수행 하는 데 사용할 수는 있지만 숨겨져 있어야하는 사용자로부터 직원을 격리 하는 것은 약간 어려울 수 있습니다. 사용자 분류 체계가 없으며 사용자 역할을 사용할 수 있습니다. 공개적으로 보이지 않아야하는 모든 사용자에게 공개 역할 을 할당하려는 경우 문제가 발생 합니다.

다행히 이러한 문제는 실제하지 않은 문제를 쉽게 해결할 수 있습니다. 내가 제안하는 워크 플로는 다음과 같습니다.

  1. 새로운 사용자 역할을 만듭니다. 표준 역할에서 기능을 복제 할 수 있지만 역할을 만들고 다른 사용자의 직원을 격리하는 것이 매우 쉽습니다.
  2. 사용자 프로필에 대한 사용자 정의 필드를 추가하고 원하는 모든 정보를 입력하십시오.
  3. 사용자 루프 및 사용자 프로필을 처리 할 페이지 템플릿을 만듭니다. 어떻게? 포인트 4를보십시오.
  4. 다시 쓰기 엔드 포인트를 작성하십시오. 이런 식으로 URL example.com/staff은 페이지 (3에서 만든 템플릿을 할당 한 페이지) example.com/staff/user/nickname를 호출하고 같은 URL 은 동일한 페이지를 호출하지만 페이지에서 사용할 수 user있는 값으로 쿼리 var 를 전달 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(); ?>

이제 페이지를 작성하고이 템플리트를 지정하십시오. 그런 다음 직원에게 사용자 역할 'staff'를 지정하고 프로파일을 채우십시오.

마지막으로 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.