分析 WordPress `wp_mail` 过滤器源码:如何自定义邮件内容、发件人和收件人。

WordPress 邮件大师炼成记:wp_mail 过滤器深度剖析

各位观众,各位朋友,大家好!我是你们的老朋友,今天咱们不聊风花雪月,只聊代码。今天的主题是:如何成为 WordPress 邮件系统的主宰,玩转 wp_mail 过滤器,自定义你的邮件内容、发件人和收件人。准备好了吗?让我们开始吧!

1. wp_mail:WordPress 邮件系统的核心

wp_mail 是 WordPress 内置的函数,负责发送邮件。很多插件和主题都会使用它来发送各种通知,比如用户注册、评论回复、密码重置等等。但是,默认的 wp_mail 功能比较简单,很多时候我们需要自定义邮件的内容、发件人、收件人等等。这时候,wp_mail 过滤器就派上用场了。

wp_mail 函数源码(简化版):

function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() ) {
    // ... 一些准备工作 ...

    /**
     * Filters the wp_mail() arguments.
     *
     * @since 2.2.0
     *
     * @param array $args {
     *     Array of wp_mail() arguments.
     *
     *     @type string|string[] $to          Array or comma-separated string of email addresses to send message.
     *     @type string          $subject     Email subject.
     *     @type string          $message     Message contents.
     *     @type string|string[] $headers     Additional headers.
     *     @type string|string[] $attachments Paths to files to attach.
     * }
     */
    $atts = apply_filters( 'wp_mail', compact( 'to', 'subject', 'message', 'headers', 'attachments' ) );

    if ( isset( $atts['to'] ) ) {
        $to = $atts['to'];
    }

    if ( isset( $atts['subject'] ) ) {
        $subject = $atts['subject'];
    }

    if ( isset( $atts['message'] ) ) {
        $message = $atts['message'];
    }

    if ( isset( $atts['headers'] ) ) {
        $headers = $atts['headers'];
    }

    if ( isset( $atts['attachments'] ) ) {
        $attachments = $atts['attachments'];
    }

    // ... 发送邮件的逻辑 ...

    return $result;
}

可以看到,wp_mail 函数在发送邮件之前,会应用一个名为 wp_mail 的过滤器。这个过滤器接收一个数组 $args,包含了邮件的所有参数,比如 to(收件人)、subject(主题)、message(内容)、headers(头部)和 attachments(附件)。我们只需要通过这个过滤器修改 $args 数组,就可以自定义邮件的各个方面。

2. wp_mail 过滤器:你的邮件控制中心

wp_mail 过滤器允许我们拦截并修改 wp_mail 函数的参数。通过它可以:

  • 修改收件人(to
  • 修改邮件主题(subject
  • 修改邮件内容(message
  • 添加或修改邮件头部(headers
  • 添加或修改附件(attachments

听起来是不是很厉害?下面我们来一步步学习如何使用 wp_mail 过滤器。

3. 实战演练:自定义邮件内容

首先,我们来尝试自定义邮件的内容。假设我们想在所有邮件的底部添加一段签名。

add_filter( 'wp_mail', 'custom_mail_message' );

function custom_mail_message( $args ) {
    $args['message'] .= "<br><br>Sincerely,<br>Your WordPress Site";
    return $args;
}

这段代码做了什么?

  • add_filter( 'wp_mail', 'custom_mail_message' );:这行代码告诉 WordPress,我们要使用 custom_mail_message 函数来过滤 wp_mail 函数的参数。
  • function custom_mail_message( $args ) { ... }:这是我们自定义的过滤函数,它接收一个数组 $args,包含了邮件的所有参数。
  • $args['message'] .= "<br><br>Sincerely,<br>Your WordPress Site";:这行代码在邮件内容 $args['message'] 的末尾添加了一段签名。
  • return $args;:最后,我们将修改后的 $args 数组返回。

这样,所有通过 wp_mail 发送的邮件,都会在底部添加这段签名。是不是很简单?

4. 实战演练:自定义发件人

接下来,我们来尝试自定义发件人。WordPress 默认使用 wordpress@你的域名 作为发件人,但我们可以修改它,让邮件看起来更专业。

add_filter( 'wp_mail', 'custom_mail_from' );

function custom_mail_from( $args ) {
    $args['headers'] = array(
        'From: Your Name <[email protected]>',
        'Content-Type: text/html; charset=UTF-8' // 确保邮件内容以 HTML 格式发送
    );
    return $args;
}

这段代码做了什么?

  • $args['headers'] = array( ... );:这行代码修改了邮件头部 $args['headers']
  • 'From: Your Name <[email protected]>':这行代码设置了发件人的姓名和邮箱地址。
  • 'Content-Type: text/html; charset=UTF-8':这行代码告诉邮件客户端,邮件内容是 HTML 格式,并且使用 UTF-8 编码。 这一点很重要,否则你的HTML代码可能会显示成文本。

注意: 修改发件人可能会导致邮件被标记为垃圾邮件。为了避免这种情况,建议使用 SMTP 插件,配置正确的 SMTP 服务器信息。

5. 实战演练:自定义收件人

有时候,我们可能需要将邮件抄送给其他人,或者根据不同的情况发送给不同的收件人。这时,我们可以使用 wp_mail 过滤器来修改收件人。

add_filter( 'wp_mail', 'custom_mail_to' );

function custom_mail_to( $args ) {
    // 如果邮件主题包含 "New Order",则抄送给管理员
    if ( strpos( $args['subject'], 'New Order' ) !== false ) {
        $admin_email = get_option( 'admin_email' );
        if ( is_array( $args['to'] ) ) {
            $args['to'][] = $admin_email;
        } else {
            $args['to'] = array( $args['to'], $admin_email );
        }

        // 确保收件人数组中没有重复的邮箱地址
        $args['to'] = array_unique( $args['to'] );
    }
    return $args;
}

这段代码做了什么?

  • if ( strpos( $args['subject'], 'New Order' ) !== false ) { ... }:这行代码判断邮件主题是否包含 "New Order" 字符串。
  • $admin_email = get_option( 'admin_email' );:这行代码获取管理员的邮箱地址。
  • if ( is_array( $args['to'] ) ) { ... } else { ... }:这部分代码判断 $args['to'] 是字符串还是数组,然后将管理员的邮箱地址添加到收件人列表中。
  • $args['to'] = array_unique( $args['to'] );:这行代码确保收件人数组中没有重复的邮箱地址。

这样,所有主题包含 "New Order" 的邮件,都会抄送给管理员。

6. 高级技巧:使用条件判断

wp_mail 过滤器最强大的地方在于,我们可以使用条件判断来根据不同的情况修改邮件参数。比如,我们可以根据用户角色、文章类型、插件设置等等来定制邮件内容。

add_filter( 'wp_mail', 'custom_mail_based_on_user_role' );

function custom_mail_based_on_user_role( $args ) {
    // 获取当前用户
    $user = wp_get_current_user();

    // 如果当前用户是管理员,则添加不同的签名
    if ( in_array( 'administrator', (array) $user->roles ) ) {
        $args['message'] .= "<br><br>Best regards,<br>The Administrator";
    } else {
        $args['message'] .= "<br><br>Sincerely,<br>A Regular User";
    }
    return $args;
}

这段代码做了什么?

  • $user = wp_get_current_user();:这行代码获取当前用户。
  • if ( in_array( 'administrator', (array) $user->roles ) ) { ... } else { ... }:这部分代码判断当前用户是否是管理员,然后添加不同的签名。

这样,管理员和普通用户收到的邮件,会显示不同的签名。

7. 注意事项:避免冲突

在使用 wp_mail 过滤器时,需要注意避免与其他插件或主题产生冲突。如果多个插件都使用了 wp_mail 过滤器,可能会导致一些问题。为了避免冲突,建议:

  • 使用唯一的函数名。
  • 在过滤函数中,尽量保留原始的参数。
  • 如果需要取消其他插件的过滤,可以使用 remove_filter 函数。

8. 代码示例汇总

为了方便大家学习,这里将所有的代码示例汇总到一个表格中。

功能 代码示例 说明
自定义邮件内容 php add_filter( 'wp_mail', 'custom_mail_message' ); function custom_mail_message( $args ) { $args['message'] .= "<br><br>Sincerely,<br>Your WordPress Site"; return $args; } 在邮件底部添加签名。
自定义发件人 php add_filter( 'wp_mail', 'custom_mail_from' ); function custom_mail_from( $args ) { $args['headers'] = array( 'From: Your Name <[email protected]>', 'Content-Type: text/html; charset=UTF-8' ); return $args; } 修改发件人姓名和邮箱地址,并设置邮件内容为 HTML 格式。 注意: 建议使用 SMTP 插件。
自定义收件人 php add_filter( 'wp_mail', 'custom_mail_to' ); function custom_mail_to( $args ) { if ( strpos( $args['subject'], 'New Order' ) !== false ) { $admin_email = get_option( 'admin_email' ); if ( is_array( $args['to'] ) ) { $args['to'][] = $admin_email; } else { $args['to'] = array( $args['to'], $admin_email ); } $args['to'] = array_unique( $args['to'] ); } return $args; } 将主题包含 "New Order" 的邮件抄送给管理员。
基于用户角色自定义邮件内容 php add_filter( 'wp_mail', 'custom_mail_based_on_user_role' ); function custom_mail_based_on_user_role( $args ) { $user = wp_get_current_user(); if ( in_array( 'administrator', (array) $user->roles ) ) { $args['message'] .= "<br><br>Best regards,<br>The Administrator"; } else { $args['message'] .= "<br><br>Sincerely,<br>A Regular User"; } return $args; } 根据用户角色添加不同的签名。

9. 总结:成为邮件大师

通过 wp_mail 过滤器,我们可以完全掌控 WordPress 的邮件系统,自定义邮件内容、发件人和收件人,甚至可以根据不同的情况发送不同的邮件。 掌握了 wp_mail 过滤器,你就能成为 WordPress 邮件系统的大师,让你的网站邮件更加个性化、专业化。

希望今天的讲座对大家有所帮助。记住,代码的世界充满乐趣,只要不断学习和实践,你就能创造出无限可能! 感谢大家的观看,我们下次再见!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注