对于我的网站,每当有人在博客墙上发布内容时,我都需要向所有用户发送一封电子邮件(我正在使用 BuddyPress 和 Youzify)。 为此,我在 function.php 中编写了一个函数,但问题是我有很多用户(大约 300 个),所以当有人发布一些东西时,加载时间很长,一段时间后控制台出现 524 错误. 如果我重新加载页面,新帖子就在这里,但没有发送电子邮件。
function send_email_to_all_users($activity_array, $activity_id) {
//get the post user's id
$username = bp_core_get_username( $activity_array['user_id']);
//get the link of the new post
$view_link = bp_get_root_domain() . '/' . bp_get_activity_root_slug() . '/p/' . $activity_id;
//get every user but not the one who posted
$users = BP_Core_User::get_users( array(
'type' => 'alphabetical',
'exclude' => array( $activity->user_id ),
) );
//for every user send an email
foreach ( $users['users'] as $user ) {
$to = $user->user_email;
$subject = 'mail test subject';
$message = $username . " published <br> You can see " . $username . ', post here: ' . $view_link;
wp_mail( $to, $subject, $message );
}
}
add_action( 'bp_activity_add', 'send_email_to_all_users', 10, 4 );
当我只尝试使用一封电子邮件时,效果很好
function send_email_to_all_users($activity_array, $activity_id) {
//get the post user's id
$username = bp_core_get_username( $activity_array['user_id']);
//get the link of the new post
$view_link = bp_get_root_domain() . '/' . bp_get_activity_root_slug() . '/p/' . $activity_id;
$to = '[email protected]';
$subject = 'mail test subject';
$message = $username . " published <br> You can see " . $username . ', post here: ' . $view_link;
wp_mail( $to, $subject, $message );
}
add_action( 'bp_activity_add', 'send_email_to_all_users', 10, 4 );
有人知道如何解决这个问题吗?
300 封电子邮件并不算多,除非您的托管“较弱”或有很多并发活动帖子。 一些托管公司限制每天、每小时等可以发送的电子邮件数量。请询问您的主机。
队列插件可能有帮助,但你可以加快你的过滤功能......
这对您的需求来说效率很低:
$users = BP_Core_User::get_users...
它收集了各种你不需要的东西。您只需要电子邮件地址。而且顺序无关紧要。
所有你需要的是 WP 功能get_users.
例如,像这样的东西:
$users = get_users( array( 'fields' => array( 'user_email' ) ) );
foreach ( $users as $user ) {
$to = $user->user_email;
//...etc
}
如果您真的需要阻止作者收到电子邮件,请先获取他们的电子邮件:
$current_user = wp_get_current_user();
$current_user_email = $current_user->user_email;
然后在开始循环之前使用 unset 将其从
$users
数组中删除。