如何使用元配置文件字段中的信息创建用户个人主页?

时间:2013-09-08 作者:Iurie

我问here 如何使用外部类创建包含来自用户元配置文件字段的信息的虚拟页面。我得到了一个很好的答案,而且我已经成功地实现了它(多亏了@g-m!)。与此同时,answer的作者建议我可以“以更简单、更高效的方式”完成我想要的事情,使用核心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\\u nicename),以及他们个人资料中的一些内容。页面必须自动创建,所以我不必为每个新成员手动创建个人页面。如何实现这一点(引用的解决方案除外)?

1 个回复
最合适的回答,由SO网友:gmazzap 整理而成

首先,注册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_Queryget_posts.

并且,您可以创建模板single-member.php 要显示成员配置文件,这是一个真实的页面,而不是虚拟的页面,因此您可以将所有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。

请注意,代码未经测试,在此处编写,没有突出显示语法,因此可能会出现键入错误。。。

<小时>

A side note

不久前,一位用户问,是从页面(如当前解决方案)还是从用户元字段生成“人员”内容更好。在那个场合,我选择了第二种选择。这是因为你的问题是不同的(虚拟页面和真实页面),但是阅读该问题/答案可能对你有用。。找到它here.

结束

相关推荐

如何在控制面板中复制“Pages”部分?

我想在控制面板中创建自己的自定义页面(库)选项卡,类似于页面。这有助于我在“画廊”名称下组织画廊页面。我该怎么做?我可以对自定义帖子执行此操作,但这次不会显示模板。:/实际上,我想准确地复制“页面”,并将其命名为“Gallery”。然后我在它下面创建自定义页面。希望你能理解我的问题。