web-dev-qa-db-ja.com

自分のメタプロファイルフィールドからの情報を使用してユーザーの個人用ページを作成する方法

ここで ここで 外部クラスを使ってユーザーメタプロファイルフィールドからの情報で仮想ページを作成する方法を尋ねました。私は良い答えを得ました、そしてまた私はそれを首尾よく実行しました(@ g-mのおかげで!)。同時に、回答の作者は私が欲しいものはコアWP関数を使って、 "もっとシンプルでよりパフォーマンスの高い方法でできることを私に提案しました実際の投稿タイプを作成するだけで、CPTの登録、公開されていない(ダッシュボードにUIが表示されないなど)、ユーザープロファイルの保存/更新で、作成/更新されたCPTエントリが表示されます。

これが私が最初にいくつかの追加のユーザープロファイルフィールドを作成して保存した方法です:

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

私が欲しいのは、私のサイトに自分の個人的なページへのリンクを持つ部門のメンバーのリストを載せることです。 example.com/users/user_nicename)自分のプロファイルからいくつかのコンテンツを持つ。ページは自動的に作成されなければならないので、私は新しいメンバーごとに手動で個人用ページを作成する必要はありません。どのようにこれを達成することができますか(引用された解決策を除く)?

2
Iurie Malai

まず最初にcptを登録します。その投稿タイプのUIを追加したくない場合は、おそらくshow_uiを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 );

その後、ユーザーIDを受け入れて投稿コンテンツを作成する関数を作成します。

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

今すぐあなたはすべてのユーザーの作成/更新時にこの機能を実行する必要があります

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

それで全部です。

これで、すべてのメンバーを表示するためのarchive-member.phpテンプレートを作成できます。WP_Queryまたはget_postsを使用してそれらを取得できます。

また、メンバープロフィールを表示するためのテンプレートsingle-member.phpを作成できます。これは real ページであり、ではありません。 virtual one、このため、すべてのWP関数を一緒に使用できます。

メンバーページへのリンクが欲しいなら、もちろんあなたはget_permalink($postid);を使うことができます、しかし、これは直観的な方法ではありません、あなたはおそらくユーザーIDまたは名前からリンクを得ることを好むので、別の関数を作成しましょう:

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

この関数は柔軟で、次のように使うことができます。member_permalink($user_id)また、member_permalink($user_nicename)のように使うことができます。

現在ログインしているユーザーがメンバーの場合は、member_permalink()のような関数を使用して現在ログインしているメンバーのURLを取得できます。

コードはテストされておらず、構文の強調表示なしでここに書かれているので、タイプミスの可能性があります。


サイドノート

少し前に、ユーザーはページから(現在のソリューションのように)、またはユーザーのメタフィールドから「スタッフ」コンテンツを生成する方がよいかどうかを尋ねました。その機会に私は第二の選択肢を選んだ。それはあなたの質問が違うからです(仮想ページと実際のページ)、しかし、その質問/答えを読むのはあなたにとって役に立つことができます。それをここで見つけてください。

3
gmazzap