次のコードを使用します。
$query = new EntityFieldQuery();
$result = $query->entityCondition('entity_type', 'user')
->propertyCondition('status', 0)
// Avoid loading the anonymous user.
->propertyCondition('uid', 0, '<>')
// Comment out the next line if you need to enable also the super user.
->propertyCondition('uid', 1, '<>')
->execute();
if (isset($result['user'])) {
// Disable the email sent when the user account is enabled.
// Use this code if you don't use the code marked with (1).
// $old_value = variable_get('user_mail_status_activated_notify', TRUE);
// variable_set('user_mail_status_activated_notify', FALSE);
$uids = array_keys($result['user']);
$users = entity_load('user', $uids);
foreach ($users as $uid => $user) {
$user->status = 1;
$original = clone $user; // (1)
$user->original = $original; // (1)
user_save($user);
}
// Restore the value of the Drupal variable.
// Use this code if you don't use the code marked with (1).
// variable_set('user_mail_status_activated_notify', $old_value);
}
- コードは、有効になっていないアカウントのみを読み込みます。すでに有効になっているアカウントをロードしても意味がありません。
- このコードは、実際のアカウントではない匿名ユーザーアカウントの読み込みを回避します。
Cliveが正しいのは、user_save()を使用すると、Drupalが有効なユーザーにメールを送信できるということです。関数から使用されるコードは次のコードです。
// Send emails after we have the new user object.
if ($account->status != $account->original->status) {
// The user's status is changing; conditionally send notification email.
$op = $account->status == 1 ? 'status_activated' : 'status_blocked';
_user_mail_notify($op, $account);
}
私のコードでは、状態$account->status != $account->original->status
は検証されず、メールは送信されません。別の方法として、コードに示すように、をFALSE
呼び出す前にDrupal変数「user_mail_status_activated_notify」の値をに設定できuser_save()
ます。そのDrupal変数の値を変更すると、グローバルな影響があり、他のコードがその値をに変更しても機能しませんTRUE
。オブジェクトの$user->original
コピーへの設定は、コードで保存されているユーザーオブジェクトについて、$user
への呼び出しがuser_save()
ユーザーに効果的にメールを送信しないようにする唯一の方法です。