仅向多站点子站点的用户发送电子邮件

时间:2013-08-21 作者:Craig Jones

上下文:创建一个多站点,其中每个子站点都有自己的用户集。这些用户只能查看自己的网站。

我想知道向每个子网站的用户群发电子邮件的最简单方法是什么?例如,当一篇新的新闻帖子被放到博客中时,它会向该子网站的成员发送通知,但不会向其他人发送通知。我找到了可以在整个网络中群发电子邮件的插件,但似乎很难找到一个可以与网络和子站点分离的插件。将发送电子邮件的是子网站的管理员/所有者,而不是超级管理员。

2 个回复
SO网友:Tim McClure

实际上,我正在创建一个插件来实现这一点,对于多站点子博客来说,似乎没有任何特殊的考虑。当该函数检查博客的用户时,它只从当前博客中获取这些用户(在我的测试中)。

下面是我的一些代码,让您了解我在插件中是如何做到这一点的:

add_action("publish_post", "post_notification");

function post_notification($post_id) {

if (in_category( \'cat-slug\' ) ) {


$post = get_post($post_id);
$author = get_userdata($post->post_author);
$email_subject = "Email Subject Here";


ob_start();

include("email_header.php");

?>

//email content goes here


<?php

include("email_footer.php");


$message = ob_get_contents();

ob_end_clean();

$users = get_users();
$emails = array();

foreach ($users as $user) {


wp_mail ($emails[] = $user->user_email, $email_subject, $message);
}
}

}
最相关的区域是从$users开始,在这里我获取所有用户,然后通过将每个电子邮件地址放入wp\\u mail的$to字段向每个用户发送电子邮件。在我的测试中,它只发送给当前博客的用户,而不是那些不属于该网站的用户。

SO网友:fuxia

默认情况下,get_users() 仅返回当前博客的用户。通过设置参数,可以更清楚地说明这一点blog_id:

$users = get_users( array ( \'blog_id\' => $GLOBALS[\'blog_id\'] ) );
但这是不必要的。

现在,将Execute function when post is publishedMultiple recipients for wp_mail(), 我们可以使用这样的方法:

获取电子邮件地址

function get_notify_emails( $post, $blog_id = NULL )
{
    if ( NULL === $blog_id )
        $blog_id = $GLOBALS[ \'blog_id\' ];

    $users = get_users( array ( \'blog_id\' => $blog_id ) );

    if ( empty ( $users ) ) // something went wrong
        return array ();

    $recipients = array ();
    $from       = \'\';

    foreach ( $users as $user )
    {
        // set sender
        if ( isset ( $user->caps[ \'administrator\' ] )
            && \'1\' === $user->caps[ \'administrator\' ]
            && \'\' === $from
            )
        {
            $from = "{$user->data->display_name} <{$user->data->user_email}>";
            continue;
        }

        // exclude super admins
        if ( is_super_admin( $user->ID ) )
            continue;

        // exclude post author
        if ( (int) $post->post_author === (int) $user->ID )
            continue;

        // add the other users as recipients
        $recipients[] = "{$user->data->display_name} <{$user->data->user_email}>";
    }

    return ( array ( $from, $recipients ) );
}
发送电子邮件
add_action( \'transition_post_status\', \'notify_blog_users_on_new_posts\', 10, 3 );

function notify_blog_users_on_new_posts( $new_status, $old_status, $post )
{
    if ( \'publish\' !== $new_status or \'publish\' === $old_status )
        return;

    $post_types = get_post_types( array ( \'publicly_queryable\' => TRUE ) );

    if ( ! in_array( $post->post_type, $post_types ) )
        return;

    list ( $from, $to ) = get_notify_emails( $post );

    $subject = \'New post on \' . get_bloginfo( \'name\' ) . \': \' . get_the_title( $post );
    $headers = array ( "from:$from" );
    $message = \'Hello,
there is a new post on our blog:
\' . get_the_title( $post ) . \'
<\' . get_permalink( $post->ID ) . \'>

Enjoy!\';

    wp_mail( $to, $subject, $message, $headers );
}
这只是一个草稿,需要一些测试,我可能会将代码分为多个专用类。但它应该给出如何进行的想法。

结束