당신이 사이트에 공개적으로 보여주고 싶은 사람들이 users 인 경우 , 즉 계정을 가지고 있고 글을 쓰는 경우, WordPress 사용자 기능을 사용하는 것이 훨씬 낫습니다. CPT에 넣은 모든 정보는 사용자 메타 데이터에도 저장 될 수 있습니다 , 사용자를 만드는 것은 필수 CPT를 작성하는 것은 나를 위해, 중복 회피 할 수 있지만, (그들은 로그인해야합니다).
그러나 CPT를 사용하는 것이 몇 가지 이유로 더 간단 하다는 것을 알고 있습니다 .
- WP 관리자의 기본 프로필 페이지에는 정보가 거의 없습니다.
- WP에는 공개 프로필 페이지
author.php
가 전혀 없습니다. 프로필 페이지가 아닙니다.
- 프로필 페이지 외에도 직원 을 반복 하고 싶을 것 입니다. 물론
WP_User_Query
이 작업을 수행 하는 데 사용할 수는 있지만 숨겨져 있어야하는 사용자로부터 직원을 격리 하는 것은 약간 어려울 수 있습니다. 사용자 분류 체계가 없으며 사용자 역할을 사용할 수 있습니다. 공개적으로 보이지 않아야하는 모든 사용자에게 공개 역할 을 할당하려는 경우 문제가 발생 합니다.
다행히 이러한 문제는 실제하지 않은 문제를 쉽게 해결할 수 있습니다. 내가 제안하는 워크 플로는 다음과 같습니다.
- 새로운 사용자 역할을 만듭니다. 표준 역할에서 기능을 복제 할 수 있지만 역할을 만들고 다른 사용자의 직원을 격리하는 것이 매우 쉽습니다.
- 사용자 프로필에 대한 사용자 정의 필드를 추가하고 원하는 모든 정보를 입력하십시오.
- 사용자 루프 및 사용자 프로필을 처리 할 페이지 템플릿을 만듭니다. 어떻게? 포인트 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>
그게 다야. 그것을 테스트하고 개선하고 재미있게 보내십시오.