Wordpress kullanıcı profillerini kullanmaya karşı 'personel' için özel yazı tipi?


13

Karşılaştığım bir senaryo, bir kuruluşun bir tür listeye ve biyografik bilgilere sahip tek bir profil sayfasına sahip olmasını istediğim birkaç personele sahip olabileceğidir.

Genellikle personel için özel bir yazı türü ve belki de gerekirse özel bir sınıflandırma oluşturmak.

Ama şimdi Wordpress'te yerleşik "kullanıcı" yazı tipini kullanmanın uygun olup olmadığını merak ediyorum. Kullanıcı profili alanlarını özelleştirebileceğimi, kullanıcı listelerini, tek profilleri vb. Gösterebileceğimi fark ediyorum. Özel sınıflandırmaların da mümkün olduğuna inanıyorum.

Burada en iyi uygulama var mı?

Şimdi tüm personelin kendi isimleri altında blog yazıları yazdığı ve bu yüzden yine de bir kullanıcı hesabına sahip olduğum bir durumum var ve belki de sadece kullanıcı profillerini etmeden ve author.php ile çalışmak yerine daha iyi olduğumu düşündüm. 'personel' özel posta türünü kullanarak.

Şimdilik CPT ile devam ediyorum ve "personel" gönderilerini "kullanıcı" hesaplarıyla ilişkilendirmek ve böylece blog gönderilerinin listesini tek personel sayfalarında oluşturmak için Posts 2 Posts eklentisini kullanıyorum.

Bunu wordpress'te en iyi nasıl uygulayacağınız hakkındaki düşünceler takdir edilmektedir.

Yanıtlar:


17

Bir sitede herkese açık olarak göstermek istediğiniz kullanıcılar kullanıcısa , yani bir hesabınız varsa ve yayın yazıyorsa, bence WordPress kullanıcı işlevini kullanmak daha iyidir: CPT'ye koyacağınız tüm bilgiler kullanıcı meta verilerine de eklenebilir ve kullanıcı oluşturmak zorunludur (giriş yapmak zorundalar), bir CPT oluşturmaktan kaçınılabilir ve benim için gereksizdir.

Ancak, bazı nedenlerden dolayı bir CPT kullanmanın daha basit olabileceğini biliyorum :

  1. WP admin'deki varsayılan profil sayfasında çok az bilgi var.
  2. WP'de hiç genel profil sayfası yok: author.phpbir profil sayfası değil.
  3. Profil sayfasına ek olarak, muhtemelen istediğiniz döngü personel aracılığıyla, ve kullanabileceğiniz tabii WP_User_Querybunu yapmak, ama gereken kullanıcılardan personel izole gizli biraz zor olabilir: Kullanıcı taksonomisi ve kullanıcı rollerini edebilir kullanarak yoktur herkese açık olarak görünür olmaması gereken herhangi bir kullanıcıya genel rol atamak istiyorsanız sorun oluşturabilirsiniz .

Neyse ki bu problemler gerçek problem değildir ve kolayca çözülebilir. Önerdiğim iş akışı:

  1. Yeni bir kullanıcı rolü oluşturun. Standart bir rolden yetenekleri klonlayabilirsiniz, ancak bir rol oluşturmak ve personeli diğer kullanıcılardan izole etmek çok kolay olacaktır.
  2. Kullanıcı profilleri için özel alanlar ekleyin ve istediğiniz tüm bilgileri girin.
  3. Kullanıcı döngüsünü ve kullanıcı profilini işleyecek bir sayfa şablonu oluşturun. Nasıl? 4. noktaya bakın.
  4. Yeniden yazma bitiş noktası oluşturun. Bu şekilde, benzer bir URL example.com/staffbir sayfayı çağıracaktır (3. şablonda oluşturulan şablonu atadığınız URL) ve benzer bir URL example.com/staff/user/nicknameaynı sayfayı çağıracak, ancak kullanıcıyı göstermek için sayfada kullanabileceğiniz userdeğere nicknamesahip sorgu var değerini iletecektir. profil.

1., 2. ve 4. bir eklenti içinde kolayca yapılabilir. Size bu eklentinin kemiklerini vereceğim , bu geliştirilmelidir:

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

Eklenti tam olarak söylediğim şeyi yapıyor. Kullanıcı profilleri için özel alanlar eklemeyle ilgili olarak, örnek olarak yalnızca 3 alan ekledim. Bunlardan biri kullanıcı görüntüsü için kullanılmak üzere tasarlanmıştır ve bir ekin kimliğini kabul eder. Tabii ki gerçek dünyada medya yükleyiciyi aramak ve kullanıcının bir resim yüklemeyi seçmesine izin vermek daha iyidir, ancak bu bu cevap kapsamında değildir ...

Eklenti kaydedilip etkinleştirildikten sonra sayfa şablonu oluşturmanız, bir sayfa oluşturmanız ve bu şablonu atamamız gerekir. Yine, burada şablon için bir kavram kanıtı göndereceğim:

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

Şimdi bir sayfa oluşturun ve bu şablonu atayın. Ardından, personelinize 'personel' kullanıcı rolünü atayın ve profilleri doldurun.

Son dokunuş olarak, author.phpmuhtemelen başlığa, bunun gibi bir şey ekleyebilirsiniz:

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

Bu kadar. Test edin, geliştirin ve eğlenin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.