कस्टम पोस्ट टाइप 'स्टाफ' बनाम वर्डप्रेस यूजर प्रोफाइल का उपयोग करने के लिए?


13

एक परिदृश्य जो मैं भर में आता रहता हूं वह यह है कि एक संगठन के पास कई कर्मचारी हो सकते हैं जिनके लिए मैं किसी प्रकार की सूची बनाना चाहता हूं और भौगोलिक जानकारी के साथ एक एकल प्रोफ़ाइल पृष्ठ।

आमतौर पर मैं कर्मचारियों के लिए एक कस्टम पोस्ट टाइप बनाता हूँ और शायद जरूरत पड़ने पर कस्टम टैक्सोनॉमी भी।

लेकिन अब मैं सोच रहा हूँ कि क्या यह Wordpress में अंतर्निहित "उपयोगकर्ता" पोस्ट प्रकार का उपयोग करने के लिए इष्टतम नहीं हो सकता है। मुझे लगता है कि मैं उपयोगकर्ता प्रोफ़ाइल फ़ील्ड को अनुकूलित कर सकता हूं, उपयोगकर्ता लिस्टिंग प्रदर्शित कर सकता हूं, एकल प्रोफ़ाइल आदि कस्टम टैक्सोनॉमी संभव हैं, जो मुझे विश्वास है।

क्या यहां सबसे अच्छा अभ्यास है?

मेरे पास अब एक मामला है जहां सभी कर्मचारी अपने नाम के तहत ब्लॉग पोस्ट भी लिख रहे हैं और इसलिए वैसे भी एक उपयोगकर्ता खाता है और इसने मेरे दिमाग को पार कर दिया है कि शायद मैं अपने उपयोगकर्ता प्रोफाइल को ठीक कर रहा हूं और लेखक के साथ काम कर रहा हूं। इसके बजाय। 'स्टाफ' के कस्टम पोस्ट प्रकार का उपयोग करना।

अभी के लिए मैं सीपीटी के साथ जा रहा हूं और अपने "स्टाफ" पोस्ट को उनके "उपयोगकर्ता" खाते के साथ जोड़ने के लिए पोस्ट 2 पोस्ट प्लगइन का उपयोग कर रहा हूं और इस तरह अपने एकल स्टाफ पेज पर अपने ब्लॉग पोस्ट की सूची बना रहा हूं।

कैसे WordPress में इसे लागू करने के लिए सबसे अच्छा है पर कोई विचार की सराहना की है।

जवाबों:


17

यदि आप जिन लोगों को किसी साइट पर सार्वजनिक रूप से दिखाना चाहते हैं , वे उपयोगकर्ता हैं , जिनके पास एक खाता है और पोस्ट लिखा है, तो मेरी राय में वर्डप्रेस उपयोगकर्ता की कार्यक्षमता का उपयोग करना बेहतर है: सीपीटी में आपके द्वारा डाली गई सभी जानकारी को उपयोगकर्ता मेटाडेटा में भी डाला जा सकता है। , और उपयोगकर्ताओं को बनाना अनिवार्य है (उन्हें लॉगिन करना होगा), जबकि सीपीटी बनाने से बचा जा सकता है और, मेरे लिए, बेमानी है।

हालाँकि, मुझे पता है कि 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साथ क्वेरी वर्जन पास 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.