web-dev-qa-db-de.com

Wie erstelle ich persönliche Benutzerseiten mit Informationen aus den Metaprofilfeldern?

Ich habe hier gefragt , wie virtuelle Seiten mit Informationen aus den Benutzer-Metaprofilfeldern mithilfe einer externen Klasse erstellt werden sollen. Ich habe eine gute Antwort bekommen und diese auch erfolgreich umgesetzt (danke an @ g-m!). Gleichzeitig schlug mir der Autor der Antwort vor, dass das, was ich will, " auf viel einfachere und performantere Weise " unter Verwendung des Kerns WPgetan werden kann. _ funktioniert, indem nur ein echter Beitragstyp erstellt wird: Registrieren eines CPT, möglicherweise nicht öffentlich (daher wird im Dashboard keine Benutzeroberfläche angezeigt), und Speichern/Aktualisieren des gerade erstellten/aktualisierten CPT-Eintrags für das Benutzerprofil.

So habe ich zunächst einige zusätzliche Benutzerprofilfelder erstellt und gespeichert:

/* Add Extra Fields to the User Profile */
add_action( 'show_user_profile', 'extra_user_profile_fields' );
add_action( 'edit_user_profile', 'extra_user_profile_fields' );

function extra_user_profile_fields( $user ) { ?>
   <h3><?php _e("Academic", "blank"); ?></h3>
   <table class="form-table">
      <!-- Teaching position -->
      <tr>
      <th><label for="teaching_position"><?php _e("Teaching position"); ?></label></th>
      <td>
      <input type="text" name="teaching_position" id="teaching_position" value="<?php echo esc_attr( get_the_author_meta( 'teaching_position', $user->ID ) ); ?>" class="regular-text" /><br />
      <span class="description"><?php _e("Put here your teaching position"); ?></span>
      </td>
      </tr>
   </table>
}

/* Save Extra User Profile Fields */
add_action( 'personal_options_update', 'save_extra_user_profile_fields' );
add_action( 'edit_user_profile_update', 'save_extra_user_profile_fields' );

function save_extra_user_profile_fields( $user_id ) {
   if ( !current_user_can( 'edit_user', $user_id ) ) { return false; }
   update_user_meta( $user_id, 'teaching_position', $_POST['teaching_position'] );
}

Ich möchte auf meiner Website eine Liste von Abteilungsmitgliedern mit Links zu ihren persönlichen Seiten (z. example.com/users/user_nicename) mit Inhalten aus ihren Profilen. Seiten müssen automatisch erstellt werden, damit ich nicht für jedes neue Mitglied manuell eine persönliche Seite erstellen muss. Wie kann dies erreicht werden (mit Ausnahme der genannten Lösung)?

2
Iurie Malai

Registrieren Sie zuerst die cpt. Wenn Sie die Benutzeroberfläche für diesen Beitragstyp nicht hinzufügen möchten, können Sie den show_ui wahrscheinlich auf false setzen.

$args = array(
  'label' => 'Members',
  'public' => true,
  'exclude_from_search' => true,
  'show_ui' => false,
  'show_in_nav_menus' => false,
  'show_in_menu' => false,
  'show_in_admin_bar' => false,
  'hierarchical' => false,
  'has_archive' => true,
  'publicly_queryable' => true,
  'rewrite' => true,
  'query_var' => 'member'
);
register_post_type( 'member', $args );

Erstellen Sie anschließend eine Funktion, die eine Benutzer-ID akzeptiert, und erstellen Sie den Beitragsinhalt

function create_member_page( $user_id = '' ) {
  $user = new WP_User($user_id);
  if ( ! $user->ID ) return '';

  // check if the user whose profile is updating has already a post
  global $wpdb;
  $member_post_exists = $wpdb->get_var( $wpdb->prepare(
   "SELECT ID FROM $wpdb->posts WHERE post_name = %s AND post_type = 'member' and post_status = 'publish'", $user->user_nicename
  ) );

  // you have a custom role for members?
  // you should, because if not all user will have a page, also admin, subscribers...
  // if ( ! in_array('member', $user->roles) ) return '';

  $user_info = array_map( function( $a ){ return $a[0]; }, get_user_meta( $user->ID ) );
  $title = $user_info['first_name'] . ' ' . $user_info['last_name'];
  // of course create the content as you want
  $content = 'This is the page for: ';
  $content .= $user_info['first_name'] . ' ' .$user_info['last_name'];
  $post = array(
    'post_title' => $title,
    'post_name' => $user->user_nicename,
    'post_content' => $content,
    'post_status' => 'publish',
    'post_type' => 'member'
  );
  if ( $member_post_exists ) {
    $post['ID'] = $member_post_exists;
    wp_update_post( $post );
  } else {
    wp_insert_post( $post );
  }
}

Jetzt müssen Sie diese Funktion bei jeder Benutzererstellung/-aktualisierung ausführen

add_action( 'personal_options_update', 'create_member_page' );
add_action( 'edit_user_profile_update', 'create_member_page' );

Das ist alles.

Jetzt können Sie Ihre archive-member.php-Vorlage erstellen, um alle Mitglieder anzuzeigen. Sie können sie mit WP_Query oder get_posts abrufen.

Und Sie können die Vorlage single-member.php erstellen, um das Mitgliedsprofil anzuzeigen. Dies ist eine echte Seite, keine virtuelle eins, aus diesem Grund können Sie alle WP -Funktionen damit verwenden.

Wenn Sie einen Link zur Mitgliederseite wünschen, können Sie natürlich get_permalink($postid); verwenden, aber dies ist keine intuitive Methode. Sie möchten wahrscheinlich lieber einen Link von einer Benutzer-ID oder einem Benutzernamen erhalten. Erstellen wir also eine weitere Funktion:

function member_permalink ( $user = '' ) {
  if ( ! empty($user) ) {
    if ( is_numeric($user) ) { // user id
      $userObj = get_user($user);
    } else { // user nicename
      $userObj = -1;
    }
  } else {
     $userObj = wp_get_current_user();
     $name = isset($userObj->user_nicename) ? $userObj->user_nicename : '';
  }
  if ( ! isset($name) ) $name = $userObj == -1 ? $user : $userObj->user_nicename;
  global $wpdb;
  $id = $wpdb->get_var( $wpdb->prepare(
    "SELECT ID FROM $wpdb->posts WHERE post_name = %s AND post_type = 'member' AND post_status = 'publish'",
    $name
  ) );
  return $id ? get_permalink($id) : '';
}

Diese Funktion ist flexibel und kann wie folgt verwendet werden: member_permalink($user_id) Sie können sie auch wie folgt verwenden: member_permalink($user_nicename).

Wenn der aktuell angemeldete Benutzer Mitglied ist, können Sie die Funktion member_permalink() verwenden, um die URL des aktuell angemeldeten Mitglieds abzurufen.

Beachten Sie, dass der Code ungetestet und hier ohne Syntaxhervorhebung geschrieben ist, sodass die Gefahr von Tippfehlern besteht.


Eine Randnotiz

Vor einiger Zeit fragte ein Benutzer, ob es besser sei, 'Mitarbeiter'-Inhalte aus Seiten (wie der aktuellen Lösung) oder aus Benutzer-Metafeldern zu generieren. Bei dieser Gelegenheit entschied ich mich für die zweite Option. Das liegt daran, dass Ihre Frage unterschiedlich ist (virtuelle Seiten vs. reale Seiten). Lesen Sie jedoch, dass Frage/Antwort für Sie nützlich sein kann. Finden Sie sie hier .

3
gmazzap