enable_rest_api(); $this->enable_wp_cli(); add_action( 'init', function () { Event_Manager::register_model_events( 'customer', __('Customer', 'wp-ultimo'), array('created', 'updated') ); } ); add_action('wp_login', array($this, 'log_ip_and_last_login'), 10, 2); add_filter('heartbeat_send', array($this, 'on_heartbeat_send')); add_action('wu_transition_customer_email_verification', array($this, 'transition_customer_email_verification'), 10, 3); add_action('init', array($this, 'maybe_verify_email_address')); add_action('wu_maybe_create_customer', array($this, 'maybe_add_to_main_site'), 10, 2); add_action('wp_ajax_wu_resend_verification_email', array($this, 'handle_resend_verification_email')); } /** * Handle the resend verification email ajax action. * * @since 2.0.4 * @return void */ public function handle_resend_verification_email() { if ( ! check_ajax_referer('wu_resend_verification_email_nonce', false, false)) { wp_send_json_error(new \WP_Error('not-allowed', __('Error: you are not allowed to perform this action.', 'wp-ultimo'))); exit; } $customer = wu_get_current_customer(); if ( ! $customer) { wp_send_json_error(new \WP_Error('customer-not-found', __('Error: customer not found.', 'wp-ultimo'))); exit; } $customer->send_verification_email(); wp_send_json_success(); exit; } /** * Handle heartbeat response sent. * * @since 2.0.0 * * @param array $response The Heartbeat response. * @return array $response The Heartbeat response */ public function on_heartbeat_send($response) { $this->log_ip_and_last_login(wp_get_current_user()); return $response; } /** * Saves the IP address and last_login date onto the user. * * @since 2.0.0 * * @param WP_User $user The WP User object of the user that logged in. * @return void */ public function log_ip_and_last_login($user) { if ( ! is_a($user, '\WP_User')) { $user = get_user_by('login', $user); } if ( ! $user) { return; } $customer = wu_get_customer_by_user_id($user->ID); if ( ! $customer) { return; } $customer->update_last_login(); } /** * Watches the change in customer verification status to take action when needed. * * @since 2.0.0 * * @param string $old_status The old status of the customer verification. * @param string $new_status The new status of the customer verification. * @param integer $customer_id Customer ID. * @return void */ public function transition_customer_email_verification($old_status, $new_status, $customer_id) { if ($new_status !== 'pending') { return; } $customer = wu_get_customer($customer_id); if ($customer) { $customer->send_verification_email(); } } /** * Verifies a customer by checking the email key. * * If only one membership is available and that's pending, * we set it to active. That will trigger the publication of * pending websites as well. * * @since 2.0.0 * @return void */ public function maybe_verify_email_address() { $email_verify_key = wu_request('email-verification-key'); if ( ! $email_verify_key) { return; } $customer_hash = wu_request('customer'); $customer_to_verify = wu_get_customer_by_hash($customer_hash); if ( ! is_user_logged_in()) { wp_die( sprintf( /* translators: the placeholder is the login URL */ __('You must be authenticated in order to verify your email address. Click here to access your account.', 'wp-ultimo'), wp_login_url( add_query_arg( array( 'email-verification-key' => $email_verify_key, 'customer' => $customer_hash, ) ) ) ) ); } if ( ! $customer_to_verify) { wp_die(__('Invalid verification key.', 'wp-ultimo')); } $current_customer = wu_get_current_customer(); if ( ! $current_customer) { wp_die(__('Invalid verification key.', 'wp-ultimo')); } if ($current_customer->get_id() !== $customer_to_verify->get_id()) { wp_die(__('Invalid verification key.', 'wp-ultimo')); } if ($customer_to_verify->get_email_verification() !== 'pending') { wp_die(__('Invalid verification key.', 'wp-ultimo')); } $key = $customer_to_verify->get_verification_key(); if ( ! $key) { wp_die(__('Invalid verification key.', 'wp-ultimo')); } if ($key !== $email_verify_key) { wp_die(__('Invalid verification key.', 'wp-ultimo')); } /* * Uff! If we got here, we can verify the customer. */ $customer_to_verify->disable_verification_key(); $customer_to_verify->set_email_verification('verified'); $customer_to_verify->save(); /* * Checks for memberships and pending sites. */ $memberships = $customer_to_verify->get_memberships(); /* * We can only take action if the customer has * only one membership, otherwise we can't be sure about * which one to manage. */ if (count($memberships) === 1) { $membership = current($memberships); /* * Only publish pending memberships */ if ($membership->get_status() === Membership_Status::PENDING) { $membership->publish_pending_site_async(); if ($membership->get_date_trial_end() <= gmdate('Y-m-d 23:59:59')) { $membership->set_status(Membership_Status::ACTIVE); } $membership->save(); } elseif ($membership->get_status() === Membership_Status::TRIALING) { $membership->publish_pending_site_async(); } $payments = $membership->get_payments(); if ($payments) { $redirect_url = add_query_arg( array( 'payment' => $payments[0]->get_hash(), 'status' => 'done', ), wu_get_registration_url() ); wp_redirect($redirect_url); exit; } } wp_redirect(get_admin_url($customer_to_verify->get_primary_site_id())); exit; } /** * Maybe adds the customer to the main site. * * @since 2.0.0 * * @param Customer $customer The customer object. * @param Checkout $checkout The checkout object. * @return void */ public function maybe_add_to_main_site($customer, $checkout) { if ( ! wu_get_setting('add_users_to_main_site')) { return; } $user_id = $customer->get_user_id(); $is_already_user = is_user_member_of_blog($user_id, wu_get_main_site_id()); if ($is_already_user === false) { $role = wu_get_setting('main_site_default_role', 'subscriber'); add_user_to_blog(wu_get_main_site_id(), $user_id, $role); } } }