Benutzerdefinierter Beitragstyp für "Mitarbeiter" im Vergleich zur Verwendung von WordPress-Benutzerprofilen?

13

Ein Szenario, auf das ich immer wieder stoße, besteht darin, dass eine Organisation mehrere Mitarbeiter hat, für die ich eine Liste und eine einzelne Profilseite mit biografischen Informationen haben möchte.

Normalerweise würde ich einen benutzerdefinierten Beitragstyp für Mitarbeiter erstellen und bei Bedarf eine benutzerdefinierte Taxonomie.

Aber jetzt frage ich mich, ob es möglicherweise nicht optimal ist, den eingebauten "Benutzer" -Post-Typ in Wordpress zu verwenden. Mir ist klar, dass ich die Benutzerprofilfelder anpassen, Benutzerlisten, einzelne Profile usw. anzeigen kann. Ich glaube, dass auch benutzerdefinierte Taxonomien möglich sind.

Gibt es hier eine bewährte Methode?

Ich habe jetzt einen Fall, in dem alle Mitarbeiter auch Blogposts unter ihrem eigenen Namen schreiben und deshalb sowieso ein Benutzerkonto haben, und mir fiel ein, dass ich vielleicht besser einfach nur ihre Benutzerprofile ausarbeiten und stattdessen mit author.php arbeiten sollte mit dem benutzerdefinierten Beitragstyp "Mitarbeiter".

Im Moment habe ich mich für das CPT entschieden und das Plugin "Posts 2 Posts" verwendet, um den "Staff" -Post mit dem "User" -Konto zu verknüpfen und dadurch eine Auflistung der Blog-Posts auf der einzelnen Personalseite zu erstellen.

Alle Gedanken darüber, wie man dies am besten in WordPress umsetzt, sind willkommen.

Bongomane
quelle

Antworten:

17

Wenn Leute, die Sie öffentlich auf einer Site zeigen möchten, Benutzer sind , dh ein Konto haben und Beiträge schreiben, ist es meiner Meinung nach viel besser, die WordPress-Benutzerfunktionalität zu verwenden: Alle Informationen, die Sie in ein CPT eingeben würden, können auch in Benutzermetadaten eingegeben werden Das Erstellen von Benutzern ist obligatorisch (sie müssen sich anmelden), während das Erstellen eines CPT vermieden werden kann und für mich überflüssig ist.

Ich weiß jedoch, dass die Verwendung eines CPT aus folgenden Gründen einfacher sein kann:

  1. Die Standardprofilseite des WP-Administrators enthält nur wenige Informationen.
  2. In WP gibt es überhaupt keine öffentliche Profilseite: Es author.phphandelt sich nicht um eine Profilseite.
  3. Neben der Profilseite, möchten Sie wahrscheinlich zu Schleife durch Personal und natürlich die Sie verwenden können , WP_User_Querydies zu tun, sondern isolieren Personal von den Benutzern , die müssen versteckt ein wenig schwer sein kann: kein Benutzer Taxonomie ist und mit Benutzerrollen können Generieren Sie Probleme, wenn Sie die öffentliche Rolle einem Benutzer zuweisen möchten, der nicht öffentlich sichtbar sein darf.

Zum Glück sind diese Probleme keine wirklichen Probleme und können leicht gelöst werden. Der Workflow, den ich vorschlage, ist:

  1. Erstellen Sie eine neue Benutzerrolle. Sie können Funktionen von einer Standardrolle klonen, aber das Erstellen einer Rolle und das Isolieren von Mitarbeitern von anderen Benutzern ist sehr einfach.
  2. Fügen Sie benutzerdefinierte Felder für Benutzerprofile hinzu und geben Sie alle gewünschten Informationen ein.
  3. Erstellen Sie eine Seitenvorlage, die die Benutzerschleife und das Benutzerprofil behandelt. Wie? Schauen Sie sich Punkt 4 an.
  4. Erstellen Sie einen Umschreibe-Endpunkt. Auf diese Weise example.com/staffruft eine URL wie eine Seite auf (die, die Sie der am 3. erstellten Vorlage zuweisen), und eine URL wie example.com/staff/user/nicknameruft dieselbe Seite auf, übergibt jedoch die Abfragevariable usermit einem Wert nickname, den Sie auf der Seite verwenden können, um den Benutzer anzuzeigen Profil.

1., 2. und 4. können einfach in einem Plugin erledigt werden. Ich werde dir die Bones dieses Plugins geben, die verbessert werden sollten:

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

Das Plugin macht genau das, was ich gesagt habe. Als Beispiel für das Hinzufügen benutzerdefinierter Felder für Benutzerprofile habe ich nur drei Felder hinzugefügt. Eine davon ist für ein Benutzerbild vorgesehen und akzeptiert die ID eines Anhangs. In der realen Welt ist es natürlich besser, den Medien-Uploader anzurufen und den Benutzer ein Bild hochladen zu lassen, aber dies ist nicht im Umfang dieser Antwort ...

Nachdem das Plugin gespeichert und aktiviert wurde, müssen wir die Seitenvorlage erstellen, eine Seite erstellen und diese Vorlage zuweisen. Auch hier werde ich einen Proof of Concept für die Vorlage posten:

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

Erstellen Sie nun eine Seite und weisen Sie diese Vorlage zu. Weisen Sie dann Ihren Mitarbeitern die Benutzerrolle 'Mitarbeiter' zu und füllen Sie die Profile aus.

Als letzten Schliff können Sie in Ihrem author.phpText, wahrscheinlich in der Kopfzeile, Folgendes hinzufügen:

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

Das ist alles. Teste es, verbessere es und habe Spaß damit.

gmazzap
quelle