wp_mail函数在用户查询循环中不起作用



我试图发送电子邮件给每一个用户谁是登录超过一年以前(基于woocommerce元值从数据库),但电子邮件不出去。在我的代码中,我试图在测试阶段过滤自己,这样只有我收到邮件,测试后这些行将被删除(在代码中标记)。我们在邮件队列中使用SMPT,在其他类似的代码中使用wp_mail函数,其中wp_mail工作正常。

更新:

根据第一个答案更新代码,但仍然没有结果。

查询在现场前端测试中似乎很好,因为我在$to变量中得到了我的电子邮件地址。

尝试添加"ini_set("display_error ",1);error_reporting (E_ALL);"代码,但没有错误。

function my_notifyOldUsers() {
global $wpdb;
$query = $wpdb->prepare("SELECT user_id FROM $wpdb->usermeta WHERE ( meta_key='wc_last_active' AND DATE_ADD(FROM_UNIXTIME(meta_value), INTERVAL 1 DAY) > NOW() )");  //will be 365 DAY and "<" after testing
$oldusers = $wpdb->get_results($query, ARRAY_N);
require_once( ABSPATH.'wp-admin/includes/user.php' );
foreach ($oldusers as $olduser) {
$user = get_userdata( $olduser[0] );
$user_azonosito = $user->ID;        //this line will be deleted after testing
if( $user_azonosito == 4210 ) {     //this line will be deleted after testing, ID 4210 is myself
$headers = array(
'Content-Type: text/html; charset=UTF-8',
'From: Vidéki Vendégházak <videkivendeghazak@gmail.com>'
);
$to = $user->user_email;
$subject = "Fiókod hamarosan törlésre kerül";
$body = "<p style='font-size: 16px; margin-bottom: 20px;'>Kedves Szállásadó!</p><p style='font-size:14px; margin-bottom: 20px;'>A <a href='https://videkivendeghazak.hu'>Vidéki Vendégházak oldalon</a> felhasználói fiókod 30 nap múlva <b>automatikus törlésre kerül minden általad létrehozottt tartalommal együtt.</b></p><p style='font-size:14px; margin-bottom: 20px;'>Amennyiben nem szeretnéd, hogy fiókod törlésre kerüljön, úgy a következő 30 napon belül lépj be felhasználói fiókodba <a href='https://videkivendeghazak.hu/fiokom'>ezen a linken keresztül.</a></p><p style='font-size:14px;'>Üdvözlettel: a Vidéki Vendégházak csapata</p>";
wp_mail( $to, $subject, $body, $headers );
}
}
}

我还尝试删除过滤行(if/else)并手动设置$to为我的电子邮件,但都不起作用,邮件没有发出。

这里的问题是您的return;在else。你告诉代码如果条件不匹配就返回然后在foreach中返回一些东西。这意味着,如果第一次迭代不匹配if语句,它将返回,foreach将中断,您的函数将return什么也没有。

一般来说,我们不应该在foreach中返回任何东西,我们可以将值存储在一个变量中,然后使用break,然后在foreach之外返回存储的变量值。

如果你要测试这个问题,那么在一个在线php编译器上尝试类似的代码

<?php
$oldusers = [100,101,102,104, 4210];
foreach ($oldusers as $olduser) {    
if($olduser == 4210 ) {  
echo 'found it';
}else { 
return;
}
}
?>

如果您运行该代码,您将不会看到found it作为输出,但如果您只是删除return;,您将看到它。

所以在你的代码中,你只需要删除else条件和return,如果上述所有查询和其他事情都是正确的,你的问题应该得到解决。

最新更新