在本系列的前面,我们介绍了如何自定义WordPress登录和注册表单。 然后,我们在注册表格中添加了一些自定义字段。 今天,在本系列的第三篇也是最后一部分中,我们将介绍如何为您的站点用户开发“我的帐户”部分,以便用户可以编辑其个人资料信息。
页面设置
我们要做的第一件事是创建一个页面模板来容纳我们的内容。 我想在页面模板的前面加上“模板”一词。 所以我的文件名为template-user-profile.php,打开的PHP如下所示:
我已经将其保存在主题目录的根目录中。 如果您不熟悉WordPress页面模板 ,建议您阅读上面的链接。 他们非常方便。
现在,让我们转到WordPress后端,创建一个名为“配置文件”的页面,然后在“ 页面属性”元框中为其分配新创建的页面模板。 发布此页面后,前端应该有一个空白页面: http:// yourdomain / profile 。

现在将一些内容注入我们的页面。 我们希望结构是页面内容(即WordPress所见即所得中写的任何内容),然后是我们的个人资料表单。
从page.php获取代码并将其用作页面模板的起点通常会很有帮助。 这段代码根据您的主题而有所不同,但是很可能包含一个循环,它会吐出一些页面内容。 通常使用WordPress函数get_template_part()获取内容部分。 在检索内容的下面,让我们插入表单HTML。 因此,回顾一下:
- 将代码从page.php复制并粘贴到我们的页面模板中。
- 查找内容的输出位置。
- 在此之下,插入以下代码,然后我们将逐步进行介绍:
这里没有什么疯狂的事情:表单使用的是Bootstrap标记,因为我们的主题是建立在Bootstrap上的。 其他需要注意的是,该表单是使用POST方法发送的,并且其中包含了wp_nonce_field,这是一种安全令牌,可帮助防止恶意攻击。 如果您不熟悉WordPress的Nonnce,建议您阅读本文 。
检索数据
将其放置在适当的位置后,您应该在网站的前面有一个表单,但是并没有做太多事情。 我们希望它显示已登录用户的数据。 您可能已经注意到我们表单中的value属性正在回显一些PHP。
value="first_name; ?>"
由于我们尚未编写代码,因此该$user_info
对象目前不存在,所以让我们从此处开始。 将以下代码粘贴到template-user-profile.php中的表单之前。
使用某些WordPress本机功能,它可以获取当前用户的ID,并由此我们可以获取用户的数据。 这存储在名为$user_info
的对象中,并且如上所示,我们可以很容易地检索用户数据。 要查看存储在该对象中的所有数据,可以像这样运行var_dump
:
。 这对于调试或仅查看您可以访问的内容很有用。
处理数据
难题的最后一部分是处理数据,从而允许用户编辑其个人资料。 为了使事情井井有条,我已将会员代码放入一个文件名为“ membership.php”的文件中。 该文件位于lib
目录中,并已包含在我们的functions.php文件中。 完成此操作后,在代码编辑器中打开新创建的Membership.php文件,然后创建用于处理用户数据的函数。
首先,让我们快速了解一下逻辑。 当单击提交按钮时,我们要检查是否已发送我们的现时字段-这将检查数据是否来自正确的位置。
如果满足该条件,我们希望获取当前用户的ID,因为我们将需要该ID来存储数据。 然后,我们想将数据排列成WordPress喜欢的结构-在这种情况下,它是具有特定键的数组。 在保存数据之前,我们还希望对其进行验证和消毒。 最后,我们希望向用户显示成功或错误的消息。
和所有看起来像这样的代码:
sanitize_text_field( $_POST['first_name'] ),
'last_name' => sanitize_text_field( $_POST['last_name'] ),
'user_email' => sanitize_email( $_POST['email'] ),
'twitter_name' => sanitize_text_field( $_POST['twitter_name'] ),
'user_pass' => $_POST['pass1'],
);
if ( ! empty( $user_data['user_pass'] ) ) {
// Validate the passwords to check they are the same.
if ( strcmp( $user_data['user_pass'], $_POST['pass2'] ) !== 0 ) {
wp_redirect( '?password-error=true' );
exit;
}
} else {
// If the password fields are not set don't save.
unset( $user_data['user_pass'] );
}
// Save the values to the post.
foreach ( $user_data as $key => $value ) {
$results = '';
// http://codex.wordpress.org/Function_Reference/wp_update_user
if ( $key == 'twitter_name' ) {
$results = update_user_meta( $user_id, $key, $value );
unset( $user_data['twitter_name'] );
} elseif ( $key == 'user_pass' ) {
wp_set_password( $user_data['user_pass'], $user_id );
unset( $user_data['user_pass'] );
} else {
// Save the remaining values.
$results = wp_update_user( array( 'ID' => $user_id, $key => $value ) );
}
if ( ! is_wp_error( $results ) ) {
wp_redirect( '?profile-updated=true' );
}
}
wp_redirect( '?profile-updated=false' );
exit;
}
}
add_action( 'tutsplus_process_user_profile', 'tutsplus_process_user_profile_data' );
现在,您可能会注意到,正在使用三种不同的WordPress函数保存数据:
-
update_user_meta()
为Twitter名称 -
wp_set_password()
作为密码 -
wp_update_user()
用于剩余数据
您对此提出质疑是正确的。 基本上,需要使用相对功能而不是常规更新用户功能来处理自定义元数据(Twitter名称)。 至于密码,虽然它可以与wp_update_user()
,但是我遇到了问题,因此倾向于使用此方法。 请记住,这只是一个指南,并且代码通常旨在演示实现您的需求的不同方法。
好的,现在我们有了处理数据的功能,但是没有在任何地方调用它。 在我们的功能结束时,您可以看到有一个与其相关的动作。 因此,要调用该函数,我们只需要使用提供的WordPress: do_action(); 。 因此,将此行粘贴到我们前面创建的“用户个人资料”页面模板中的表单上方:
有了适当的设置,当我们提交表单时,它应该运行我们的函数并处理数据。
错误和成功消息
我们的个人资料表格应立即保存或拒绝数据。 可能这两个密码不相同,并且没有保存。 没有消息可提供用户反馈。 让我们为用户节省一些痛苦,并给他们一些消息。
在我们的tutsplus_process_user_profile()
函数中,您可能已经注意到,根据处理结果,它会将不同的查询字符串附加到URL。 因此,如果一切都保存成功,则我们的URL将附加?profile-updated=true
,并且它们会根据结果而有所不同。 我们需要做的是基于这些响应触发一条消息。
在下面,我使用了一个过滤器来获取内容,通过$_GET
的魔力,我们可以检查参数并吐出我们需要的内容。
好的, tutsplus_get_message_markup()
,我们在上面使用了一个叫做tutsplus_get_message_markup()
的函数,但是我们还没有定义它。 它带有两个参数:
- 字符串:要显示的消息
- 字符串:根据Bootstrap显示的警报严重性
因此,让我们定义我们的tutsplus_get_message_markup()
函数:
';
$output .= '';
$output .= '' . $message . '
';
$output .= '