Мне было интересно узнать, можно ли запустить функцию WordPress с задержкой в несколько секунд или минут.
Я использую следующий фрагмент, чтобы отправить электронное письмо администратору после регистрации нового пользователя на моем веб-сайте.
add_action( 'user_register', 'registration_email_to_admin', 10, 1 );
function registration_email_to_admin( $user_id ) {
wp_new_user_notification( $user_id );
}
Затем я использую следующий код для фильтрации содержимого электронной почты.
//Filters the contents of the new user notification email sent to the site admin.
add_filter( 'wp_new_user_notification_email_admin', 'custom_wp_new_user_notification_admin_email', 10, 3 );
function custom_wp_new_user_notification_admin_email( $wp_new_user_notification_email, $user, $blogname ) {
//pass user id into a variable
$user_id = $user->id;
//get teams for that user
$teams = wc_memberships_for_teams_get_teams( $user_id );
$teamNames = [];
foreach($teams as $teamName){
array_push($teamNames, $teamName->get_name());
}
$teamNamesString = implode (',' , $teamNames);
$wp_new_user_notification_email['subject'] = sprintf( '[%s] New user registered. User ID = %s', $blogname, $user->id );
$wp_new_user_notification_email['message'] = sprintf( "%s ( %s ) has registered to the website %s.", $user->user_login, $user->user_email, $blogname ) . "\r\n\r\n";
$wp_new_user_notification_email['message'] .= sprintf(__('Username: %s'), $user->user_login) . "\r\n";
$wp_new_user_notification_email['message'] .= sprintf(__('Email: %s'), $user->user_email) . "\r\n";
$wp_new_user_notification_email['message'] .= sprintf(__('ID: %s'), $user->id) . "\r\n";
$wp_new_user_notification_email['message'] .= sprintf(__('Team Name: %s'), $teamNamesString) . "\r\n";
$wp_new_user_notification_email['headers'] = "From: Members Website <[email protected]> \n\r cc: GeorgeFR <[email protected]>";
return $wp_new_user_notification_email;
}
На всем вышеперечисленном все работает хорошо, кроме последнего добавления к сообщению
$wp_new_user_notification_email['message'] .= sprintf(__('Team Name: %s'), $teamNamesString) . "\r\n";
Используя плагин WooCommerce Memberships for Teams, кажется, что новый пользователь назначается в команду, в которую был приглашен после его/ее регистрации. При этом переменная $teamNamesString
всегда пуста в содержании моей электронной почты.
Итак, возможно ли запустить все вышеперечисленное с некоторой задержкой, убедившись, что команда была назначена новому пользователю, прежде чем я отправлю электронное письмо? Для меня важно включить название команды в электронное письмо для целей управления бизнесом.
В user_register вы можете проверить, состоит ли пользователь в команде, если не назначать его, или найти хук, который назначает его и запускает там wp_new_user_notification. Его премиальный плагин, и он мало чем может помочь :)
@AkshayPaghdar, спасибо за ответ. Я пробовал это, но это не сработало. Я использовал 9999.
@MartinMirchev тоже спасибо за ваш ответ. Учетные записи создаются после того, как пользователь приглашен владельцем команды. Таким образом, они автоматически назначаются соответствующим командам после создания своих учетных записей. Мне нужно найти что-то, что будет запускать электронное письмо после того, как произойдет назначение в команду. К сожалению, в поддержке плагина сказали, что такого хука с их стороны нет.
Затем создайте свой собственный чек. Я думаю, что сработает использование хука profile_update — developer.wordpress.org/reference/hooks/profile_update. Как вы можете видеть, срабатывает при обновлении профиля, поэтому в вашей функции проверьте, назначил ли пользователь команду или изменил ее, и активируйте уведомление по электронной почте.
@MartinMirchev, это звучит как хороший обходной путь! Я собираюсь проверить это и вернуться к вам. Большое спасибо еще раз!
@MartinMirchev, я только что попробовал, но безуспешно. Мои пользователи распределяются по командам после их регистрации. Но я предполагаю, что действие user_register, о котором я упоминал изначально в своем коде, запускается непосредственно перед назначениями команд, и поэтому я не вижу значения команды в своем электронном письме администратора. Профиль_обновления ничего не делал, так как фактического обновления профиля при регистрации не происходит.
Можете ли вы подтвердить, что получили что-либо в wc_memberships_for_teams_get_teams()? Можете ли вы отладить и посмотреть, что вы получите?
Давайте продолжим обсуждение в чате.
Наконец-то я смог найти исправление здесь.
Используя плагины Woo Memberships и Woo Teams for Memberships, у нас есть 3 разных командных роли на нашем веб-сайте. Владельцы, менеджеры и участники. Кроме того, мы используем подписки Woo в сочетании с членством Woo. Таким образом, каждый раз, когда приходит новая покупка подписки, покупатель создает команду и становится ее владельцем.
Коды, которые работали, следующие:
Для владельцев (использовали действие woocommerce_subscription_status_active
от Woo Subscriptions):
//fires after purchases
function send_admin_email_with_owner_data_after_purchase( $subscription ) {
// Get the user in the order
$user_id = $subscription->get_user_id();
// Get the products in the order
$items = $subscription->get_items();
foreach( $items as $item ) {
$product = $item->get_product();
$product_id = $product->get_id();
if ($product_id == "8865") {
wp_new_user_notification( $user_id );
}
}
}
add_action( 'woocommerce_subscription_status_active', 'send_admin_email_with_owner_data_after_purchase', 10 );
Для менеджеров и участников (использовано действие wc_memberships_user_membership_created
от Woo Memberships):
//fires after acceptance of invitations to teams (in my case)
function send_admin_email_with_member_data( $plan, $args ) {
$user_id = $args['user_id'];
$memberArgs = array (
$status => "any",
$role => "manager,member"
);
//get teams for that user
$teams = wc_memberships_for_teams_get_teams( $user_id, $memberArgs );
if ( $args['is_update'] = true && ! empty( $teams ) ) {
wp_new_user_notification( $user_id );
}
}
add_action( 'wc_memberships_user_membership_created', 'send_admin_email_with_member_data', 20, 2 );
Я рад, что нашел способ здесь. Спасибо за вашу помощь!
Попробуйте изменить приоритет хука,