首先,注册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
要显示成员配置文件,这是一个真实的页面,而不是虚拟的页面,因此您可以将所有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.