好的,各位观众老爷们,咱们今天来聊聊 WordPress 里的一个不起眼,但又至关重要的函数:wp_password_change_notification()
。它负责的就是用户修改密码后,WordPress 发送通知邮件的那点事儿。虽然看起来简单,但里面还是有些门道的,咱们今天就扒开它的源码,看看它到底是怎么运作的。
开场白:密码修改后的那封邮件,你真的了解它吗?
想象一下,你辛辛苦苦注册了一个 WordPress 网站的账号,突然有一天,你觉得密码太简单了,想换一个复杂的。换完之后,你会收到一封邮件,告诉你密码已经成功修改。这封邮件是谁发的?怎么发的?发了些什么内容?这就是我们今天的主题。
一、wp_password_change_notification()
函数的来龙去脉
首先,咱们先找到这个函数的身影。它藏身于 wp-includes/pluggable.php
文件中。打开它,你会看到如下代码:
function wp_password_change_notification( $user ) {
/**
* Fires after the user's password has been changed.
*
* @since 3.9.0
*
* @param WP_User $user WP_User object.
*/
do_action( 'password_changed', $user );
$blogname = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
$message = sprintf( __( 'Hi %1$s,' ), $user->display_name ) . "rnrn";
/* translators: %s: Site title. */
$message .= sprintf( __( 'Someone requested that the password be reset for the following account:' ), $blogname ) . "rnrn";
/* translators: %s: Site address. */
$message .= sprintf( __( 'Site Name: %s' ), $blogname ) . "rnrn";
/* translators: %s: User login. */
$message .= sprintf( __( 'Username: %s' ), $user->user_login ) . "rnrn";
$message .= __( 'If you did not request a password reset, no further action is required.' ) . "rnrn";
$message .= __( 'Thanks,' ) . "rn";
$message .= $blogname . "rn";
$wp_email = 'wordpress@' . wp_parse_url( home_url(), PHP_URL_HOST );
if ( '[email protected]' == $wp_email ) {
$wp_email = sanitize_email( get_option( 'admin_email' ) );
}
/**
* Filters the email address to send password change notifications from.
*
* @since 2.8.0
*
* @param string $wp_email WordPress email address.
* @param string $user The user object.
*/
$from_email = apply_filters( 'wp_password_change_notification_email', $wp_email, $user );
/**
* Filters the name to send password change notifications from.
*
* @since 2.8.0
*
* @param string $blogname The site title.
* @param string $user The user object.
*/
$from_name = apply_filters( 'wp_password_change_notification_name', $blogname, $user );
$subject = sprintf( __( '[%s] Password Changed' ), $blogname );
/**
* Filters the subject of the password change notification email.
*
* @since 2.8.0
*
* @param string $subject The subject line of the email.
* @param WP_User $user WP_User object.
*/
$subject = apply_filters( 'wp_password_change_notification_subject', $subject, $user );
$headers = array();
$headers[] = "From: {$from_name} <{$from_email}>";
$headers[] = "Content-Type: text/plain; charset=" . get_option( 'blog_charset' );
/**
* Filters the headers of the password change notification email.
*
* @since 2.8.0
*
* @param string[] $headers The email headers.
* @param WP_User $user WP_User object.
*/
$headers = apply_filters( 'wp_password_change_notification_headers', $headers, $user );
/**
* Filters the content of the password change notification email.
*
* @since 2.8.0
*
* @param string $message The email content.
* @param WP_User $user WP_User object.
*/
$message = apply_filters( 'wp_password_change_notification_email', $message, $user );
wp_mail( $user->user_email, $subject, $message, $headers );
}
二、源码解读:一步一步揭开神秘面纱
现在,咱们一行一行地解读这段代码,看看它到底做了些什么:
-
do_action( 'password_changed', $user );
: 这是 WordPress 的钩子机制。它会在密码修改后触发一个名为password_changed
的 action。这意味着你可以通过自定义插件或主题,在这个 action 上挂载你自己的函数,来执行一些额外的操作,比如记录日志,发送短信等等。- 钩子机制: WordPress 的钩子机制允许开发者在特定的时间点插入自己的代码,而无需修改 WordPress 核心代码。
do_action()
: 用于触发一个 action。password_changed
是 action 的名称,$user
是传递给该 action 挂载的函数的参数,也就是当前的用户对象。
-
$blogname = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
: 获取网站的名称。get_option( 'blogname' )
从 WordPress 选项表中获取blogname
的值,也就是你在后台设置的网站名称。wp_specialchars_decode()
函数则用于解码 HTML 实体,确保网站名称显示正确。get_option()
: 用于从 WordPress 选项表中获取指定选项的值。wp_specialchars_decode()
: 用于解码 HTML 实体,防止网站名称包含特殊字符导致显示错误。
-
$message = sprintf( __( 'Hi %1$s,' ), $user->display_name ) . "rnrn";
: 开始构建邮件内容。这里使用了sprintf()
函数和__()
函数。__()
函数用于国际化,确保邮件内容可以翻译成不同的语言。sprintf()
函数用于格式化字符串,将用户的显示名称插入到邮件内容中。rnrn
表示换行。__()
: 用于国际化和本地化,确保邮件内容可以翻译成不同的语言。sprintf()
: 用于格式化字符串,将变量插入到字符串中。
-
接下来的几行: 继续构建邮件内容,包括网站名称、用户名、提示用户如果未请求密码重置则无需操作等信息。
-
$wp_email = 'wordpress@' . wp_parse_url( home_url(), PHP_URL_HOST );
: 设置发件人邮箱地址。它会尝试使用wordpress@你的域名
作为发件人邮箱地址。wp_parse_url()
函数用于解析 URL,获取域名。wp_parse_url()
: 用于解析 URL,获取 URL 的各个组成部分,例如域名、路径等。home_url()
: 获取网站的首页 URL。
-
if ( '[email protected]' == $wp_email ) { $wp_email = sanitize_email( get_option( 'admin_email' ) ); }
: 如果发件人邮箱地址是[email protected]
,则使用管理员邮箱地址作为发件人邮箱地址。这是为了防止一些服务器禁止使用[email protected]
作为发件人邮箱地址。sanitize_email()
函数用于验证和清理邮箱地址。sanitize_email()
: 用于验证和清理邮箱地址,确保邮箱地址格式正确。get_option( 'admin_email' )
: 获取管理员邮箱地址。
-
apply_filters( 'wp_password_change_notification_email', $wp_email, $user );
: 使用wp_password_change_notification_email
过滤器来修改发件人邮箱地址。这允许开发者通过自定义插件或主题,修改发件人邮箱地址。apply_filters()
: 用于应用一个过滤器。wp_password_change_notification_email
是过滤器的名称,$wp_email
是要过滤的值,$user
是传递给过滤器挂载的函数的参数。
-
apply_filters( 'wp_password_change_notification_name', $blogname, $user );
: 使用wp_password_change_notification_name
过滤器来修改发件人名称。 -
$subject = sprintf( __( '[%s] Password Changed' ), $blogname );
: 设置邮件主题。 -
apply_filters( 'wp_password_change_notification_subject', $subject, $user );
: 使用wp_password_change_notification_subject
过滤器来修改邮件主题。 -
$headers = array();
: 创建邮件头部数组。 -
$headers[] = "From: {$from_name} <{$from_email}>";
: 设置发件人信息到邮件头部。 -
$headers[] = "Content-Type: text/plain; charset=" . get_option( 'blog_charset' );
: 设置邮件内容类型和字符集到邮件头部。get_option( 'blog_charset' )
获取网站的字符集。get_option( 'blog_charset' )
: 获取网站的字符集。
-
apply_filters( 'wp_password_change_notification_headers', $headers, $user );
: 使用wp_password_change_notification_headers
过滤器来修改邮件头部。 -
apply_filters( 'wp_password_change_notification_email', $message, $user );
: 使用wp_password_change_notification_email
过滤器来修改邮件内容。注意,这里又使用了一次wp_password_change_notification_email
过滤器,但这次是用于过滤邮件内容,而不是发件人邮箱地址。 -
wp_mail( $user->user_email, $subject, $message, $headers );
: 发送邮件。wp_mail()
函数是 WordPress 的邮件发送函数。它接受五个参数:收件人邮箱地址、邮件主题、邮件内容、邮件头部。wp_mail()
: WordPress 的邮件发送函数。
三、关键点总结:这几个细节你必须知道
- 钩子机制是灵魂:
do_action()
和apply_filters()
的大量使用,使得这个函数具有很强的可扩展性。你可以通过钩子机制来修改邮件内容、发件人信息等等。 - 国际化是标配:
__()
函数的使用,保证了邮件内容可以翻译成不同的语言,提升了用户体验。 - 过滤器是神器:
apply_filters()
函数允许你修改邮件的各个方面,从发件人邮箱地址到邮件内容,都可以通过过滤器来定制。 wp_mail()
是最终 Boss: 所有的准备工作都是为了调用wp_mail()
函数,将邮件发送出去。
四、实战演练:如何定制你的密码修改通知邮件?
说了这么多理论,咱们来点实际的。假设你想修改密码修改通知邮件的内容,让它更个性化。你可以这样做:
- 找到你的主题的
functions.php
文件,或者创建一个自定义插件。 - 添加以下代码:
add_filter( 'wp_password_change_notification_email', 'my_custom_password_change_notification_email', 10, 2 );
function my_custom_password_change_notification_email( $message, $user ) {
$blogname = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
$message = sprintf( __( '亲爱的 %1$s,' ), $user->display_name ) . "rnrn";
$message .= sprintf( __( '您好!您在 %s 的密码已成功修改。' ), $blogname ) . "rnrn";
$message .= __( '如果您没有修改密码,请立即联系我们。' ) . "rnrn";
$message .= __( '感谢您的使用!' ) . "rn";
$message .= $blogname . "rn";
return $message;
}
这段代码使用了 wp_password_change_notification_email
过滤器,并定义了一个名为 my_custom_password_change_notification_email
的函数。这个函数接收两个参数:$message
(原始的邮件内容) 和 $user
(用户对象)。函数修改了邮件内容,并返回修改后的邮件内容。
五、常见问题解答:帮你扫清障碍
- 为什么我的密码修改通知邮件发不出去? 这可能是因为你的服务器没有配置好邮件发送功能,或者你的 WordPress 网站没有正确配置 SMTP 设置。你可以尝试安装一个 SMTP 插件,例如 WP Mail SMTP,来解决这个问题。
- 我如何修改发件人邮箱地址? 你可以使用
wp_password_change_notification_email
过滤器来修改发件人邮箱地址。 - 我如何修改邮件主题? 你可以使用
wp_password_change_notification_subject
过滤器来修改邮件主题。 - 我如何添加额外的邮件头部? 你可以使用
wp_password_change_notification_headers
过滤器来添加额外的邮件头部。
六、总结:小函数,大作用
wp_password_change_notification()
函数虽然看起来不起眼,但它在 WordPress 的用户体验中扮演着重要的角色。通过理解它的源码,你可以更好地定制你的 WordPress 网站,提升用户体验。希望今天的讲座对你有所帮助。下次再见!