如果用户Woocommerce更改了其数据,则发给管理员的电子邮件将收到有关这些更改的电子邮件。
我需要在这封信中显示在ACF中创建的自定义字段。 (在ACF中创建了一个调查表并将其放入/ edit-account)
这是完整的代码,基于-Get ACF custom fields values in woocommerce custom email notification.
if( !class_exists('WooCommerceNotifyChanges') ){
class WooCommerceNotifyChanges{
function __construct(){
// customer saves main account data
add_action('woocommerce_save_account_details', array( $this, 'woocommerce_send_notification' ), 15, 1 );
}
function woocommerce_send_notification( $user_id ){
$body = '';
$to = 'info@domain.com'; //address that will receive this email
$subject = 'One of your customers has updated their information.';
$user = new WP_User( $user_id );
$user_name = $user->user_login;
$body .= '<table>';
$body .= '<tr><td><strong>' . __("Account") . '</strong></td></tr>';
$body .= '<tr><td>Username: </td><td>' . $user_name . '</td></tr>';
$body .= '<tr><td>First name: </td><td>' . $user->billing_first_name . '</td></tr>';
$body .= '<tr><td>Last name: </td><td>' . $user->billing_last_name . '</td></tr>';
$body .= '<tr><td>Phone: </td><td>' . get_field( 'user_phone', 'user_{$user_id}' ) . '</td></tr>';
$body .= '<tr><td>Age: </td><td>' . get_field( 'user_age', 'user_{$user_id}' ) . '</td></tr>';
$body .= '</table>';
//set content type as HTML
$headers = array('Content-Type: text/html; charset=UTF-8;');
//send email
if( wp_mail( $to, $subject, $body, $headers ) ){
//echo 'email sent';
}else{
//echo 'email NOT sent';
}
//exit();
}
}
new WooCommerceNotifyChanges();
}
不幸的是,没有显示“ user_phone”和“ user_age”字段。这些自定义字段已创建并且正确。它们显示在我的帐户中。在电子邮件中,不。
的屏幕截图即使这样我也写过,但是没有出现该字段:
get_field( 'user_phone', $user_id )
答案 0 :(得分:2)
我已经研究过了,wp_user_meta()
只是get_metadata()
的包装,并且get_metadata()
缓存了结果。如果在执行过程中对您的WP用户进行了编辑,则会对其进行缓存。然后,稍后要发送此电子邮件,您将已经在内存中保存了该用户的“缓存”版本,这些是您返回的值。
您可以通过将缓存放在钩子的顶部来破坏缓存:
update_meta_cache( 'user', $user_id );
这应该破坏缓存,所以当您这样做:
get_user_meta($user_id, 'field_5b7e4f388fd11', $single=true);
您将获得更新的值。
更新的功能:
function woocommerce_send_notification( $user_id ){
$body = '';
$to = 'info@domain.com'; //address that will receive this email
$subject = 'One of your customers has updated their information.';
update_meta_cache( 'user', $user_id ); // Bust existing cached user data
$user = new WP_User( $user_id );
$user_name = $user->user_login;
$body .= '<table>';
$body .= '<tr><td><strong>' . __("Account") . '</strong></td></tr>';
$body .= '<tr><td>Username: </td><td>' . $user_name . '</td></tr>';
$body .= '<tr><td>First name: </td><td>' . $user->billing_first_name . '</td></tr>';
$body .= '<tr><td>Last name: </td><td>' . $user->billing_last_name . '</td></tr>';
$body .= '<tr><td>Phone: </td><td>' . get_field( 'user_phone', 'user_{$user_id}' ) . '</td></tr>';
$body .= '<tr><td>Age: </td><td>' . get_field( 'user_age', 'user_{$user_id}' ) . '</td></tr>';
$body .= '</table>';
//set content type as HTML
$headers = array('Content-Type: text/html; charset=UTF-8;');
//send email
if( wp_mail( $to, $subject, $body, $headers ) ){
//echo 'email sent';
}else{
//echo 'email NOT sent';
}
//exit();
}
答案 1 :(得分:0)
我认为问题在于,无论何时传递get_field()
的第二个参数,都将如何解析字符串。通过使用单引号,PHP会将其解释为字符串文字,因此您将无法将任何PHP变量传递给字符串。例如:
echo 'user_{$user_id}'; // Outputs: user_{$user_id}
但是,如果用户使用双引号,PHP将自动转义并处理:
echo "user_{$user_id"; // Outputs: user_123
因此,每当您使用get_field()
时,它都应如下所示:
get_field( 'user_phone', "user_{$user_id}" );