web-dev-qa-db-fra.com

Comment créer des pages personnelles d'utilisateur avec des informations de leurs champs de méta-profil?

J'ai demandé ici comment créer des pages virtuelles avec des informations provenant des champs du profil méta de l'utilisateur à l'aide d'une classe externe. J'ai eu une bonne réponse et je l'ai également implémentée avec succès (grâce à @ g-m!). En même temps, l'auteur de answer m'a suggéré que ce que je veux puisse être fait " de manière beaucoup plus simple et plus performante ", en utilisant le coeur WP fonctions, juste pour créer un type de message réel: enregistrement d'un CPT, peut-être pas public (aucune interface utilisateur n'apparaît donc sur le tableau de bord), et enregistrement/mise à jour du profil utilisateur créé/mis à jour.

Voici comment j'ai créé et enregistré initialement certains champs de profil d'utilisateur supplémentaires:

/* 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'] );
}

Ce que je veux, c’est de mettre sur mon site une liste des membres du département avec des liens vers leurs pages personnelles (par exemple, example.com/users/user_nicename) avec du contenu de leurs profils. Les pages doivent être créées automatiquement, je n'ai donc pas à créer manuellement une page personnelle pour chaque nouveau membre. Comment cela peut-il être réalisé (sauf la solution citée)?

2
Iurie Malai

Tout d'abord enregistrer le cpt. Probablement si vous ne voulez pas ajouter l'interface utilisateur pour ce type de publication, vous pouvez définir le show_ui sur false.

$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 );

Après cela, créez une fonction qui accepte un ID utilisateur et créez le contenu de la publication

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 );
  }
}

Maintenant, vous devez exécuter cette fonction sur chaque création/mise à jour d'utilisateur

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

C'est tout.

Maintenant, vous pouvez créer votre modèle archive-member.php pour montrer tous les membres, vous pouvez les obtenir en utilisant WP_Query ou get_posts.

Et vous pouvez créer le modèle single-member.php pour afficher le profil du membre, c’est une page réelle , pas une virtuelle un, pour cette raison, vous pouvez utiliser toute la fonction WP avec.

Si vous voulez un lien vers la page de membre, vous pouvez bien sûr utiliser get_permalink($postid); mais ce n'est pas une façon intuitive, vous préférez probablement obtenir le lien à partir d'un identifiant ou d'un nom d'utilisateur, alors créons une autre fonction:

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) : '';
}

Cette fonction est flexible, vous pouvez l’utiliser comme: member_permalink($user_id) et vous pouvez l’utiliser comme member_permalink($user_nicename).

Si l'utilisateur connecté est un membre, vous pouvez utiliser la fonction telle que member_permalink() pour récupérer l'url du membre actuellement connecté.

Notez que le code n'a pas été testé et qu'il est écrit ici, sans mise en surbrillance de la syntaxe. Il y a donc un risque de faute de frappe ...


Une note latérale

Il y a quelque temps, un utilisateur a demandé s'il était préférable de générer du contenu "personnel" à partir de pages (comme la solution actuelle) ou de champs méta d'utilisateur. A cette occasion, j'ai opté pour la deuxième option. C'est parce que votre question est différente (pages virtuelles vs pages réelles), mais lisez cette question/réponse peut vous être utile. Trouvez-la ici .

3
gmazzap