Files
woocommerce-subscriptions/includes/gifting/class-wcsg-recipient-management.php
2025-09-18 10:16:37 +00:00

679 lines
26 KiB
PHP

<?php
/**
* Recipient management.
*
* @package WooCommerce Subscriptions Gifting
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
/**
* Recipient management class.
*/
class WCSG_Recipient_Management {
/**
* Setup hooks & filters, when the class is initialised.
*/
public static function init() {
add_filter( 'wcs_get_users_subscriptions', __CLASS__ . '::get_users_subscriptions', 1, 2 );
add_action( 'woocommerce_subscription_details_after_subscription_table', array( __CLASS__, 'gifting_information_after_customer_details' ), 1 );
add_filter( 'wcs_view_subscription_actions', __CLASS__ . '::add_recipient_actions', 11, 2 );
// We want to handle the changing of subscription status before Subscriptions core.
add_action( 'init', __CLASS__ . '::change_user_recipient_subscription', 99 );
add_filter( 'wcs_can_user_put_subscription_on_hold', __CLASS__ . '::recipient_can_suspend', 1, 2 );
if ( ! is_admin() ) {
add_filter( 'woocommerce_subscription_related_orders', array( __CLASS__, 'maybe_remove_parent_order' ), 11, 2 );
}
add_filter( 'user_has_cap', __CLASS__ . '::grant_recipient_capabilities', 20, 3 );
add_action( 'delete_user_form', __CLASS__ . '::maybe_display_delete_recipient_warning', 10 );
add_action( 'delete_user', __CLASS__ . '::maybe_remove_recipient', 10, 1 );
add_filter( 'woocommerce_attribute_label', __CLASS__ . '::format_recipient_meta_label', 10, 2 );
add_filter( 'woocommerce_order_item_display_meta_value', __CLASS__ . '::format_recipient_meta_value', 10 );
add_filter( 'woocommerce_hidden_order_itemmeta', __CLASS__ . '::hide_recipient_order_item_meta', 10, 1 );
add_action( 'woocommerce_before_order_itemmeta', __CLASS__ . '::display_recipient_meta_admin', 10, 1 );
add_action( 'woocommerce_subscription_status_updated', __CLASS__ . '::maybe_update_recipient_role', 10, 2 );
// Hooked onto priority 8 for compatibility with WooCommerce Memberships.
add_action( 'woocommerce_order_status_completed', __CLASS__ . '::maybe_create_recipient', 8 );
add_action( 'woocommerce_order_status_processing', __CLASS__ . '::maybe_create_recipient', 8 );
if ( wcsg_is_woocommerce_pre( '3.0' ) ) {
add_action( 'woocommerce_add_order_item_meta', __CLASS__ . '::maybe_add_recipient_order_item_meta', 10, 2 );
}
add_action( 'woocommerce_customer_reset_password', array( __CLASS__, 'maybe_add_recipient_reset_password_flag' ) );
// Disable early renewal via modal for recipients.
add_action( 'template_redirect', array( __CLASS__, 'maybe_disable_early_renewal_modal_for_recipient' ), 100 );
}
/**
* Grant capabilities for subscriptions and related orders to recipients
*
* @param array $allcaps An array of user capabilities.
* @param array $caps The capability being questioned.
* @param array $args Additional arguments related to the capability.
* @return array
*/
public static function grant_recipient_capabilities( $allcaps, $caps, $args ) {
if ( isset( $caps[0] ) ) {
switch ( $caps[0] ) {
case 'view_order':
$user_id = $args[1];
$order = wc_get_order( $args[2] );
if ( $order ) {
if ( 'shop_subscription' === WC_Data_Store::load( 'subscription' )->get_order_type( $args[2] ) && WCS_Gifting::get_recipient_user( $order ) == $user_id ) { // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
$allcaps['view_order'] = true;
} elseif ( wcs_order_contains_renewal( $order ) ) {
$subscriptions = wcs_get_subscriptions_for_renewal_order( $order );
foreach ( $subscriptions as $subscription ) {
if ( WCS_Gifting::get_recipient_user( $subscription ) == $user_id ) { // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
$allcaps['view_order'] = true;
break;
}
}
}
}
break;
case 'pay_for_order':
$user_id = $args[1];
$order = wc_get_order( $args[2] );
if ( $order && wcs_order_contains_subscription( $order, 'any' ) ) {
$subscriptions = wcs_get_subscriptions_for_renewal_order( $order );
foreach ( $subscriptions as $subscription ) {
if ( WCS_Gifting::get_recipient_user( $subscription ) == $user_id ) { // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
$allcaps['pay_for_order'] = true;
break;
}
}
}
break;
case 'subscribe_again':
// subscribe_again is the capability used to enable resubscription. Recipients cannot resubscribe (@see https://docs.woocommerce.com/document/subscriptions-gifting/#section-13) and so we only want to enable this function for early renewals.
if ( ! isset( $_GET['subscription_renewal_early'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
break;
}
$user_id = $args[1];
$subscription = wcs_get_subscription( $args[2] );
if ( WCS_Gifting::is_gifted_subscription( $subscription ) && (int) WCS_Gifting::get_recipient_user( $subscription ) === $user_id ) {
$allcaps['subscribe_again'] = true;
}
break;
}
}
return $allcaps;
}
/**
* Adds available user actions to the subscription recipient
*
* @param array $actions An array of actions the user can peform.
* @param object $subscription Subscription object.
* @return array An updated array of actions the user can perform on a gifted subscription.
*/
public static function add_recipient_actions( $actions, $subscription ) {
if ( WCS_Gifting::is_gifted_subscription( $subscription ) && get_current_user_id() == WCS_Gifting::get_recipient_user( $subscription ) ) { // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
$recipient_actions = array();
$current_status = $subscription->get_status();
$recipient_user = wp_get_current_user();
$subscription_id = wcsg_get_objects_id( $subscription );
$admin_with_suspension_disallowed = ( current_user_can( 'manage_woocommerce' ) && '0' === get_option( WC_Subscriptions_Admin::$option_prefix . '_max_customer_suspensions', '0' ) ) ? true : false;
if ( $subscription->can_be_updated_to( 'on-hold' ) && wcs_can_user_put_subscription_on_hold( $subscription, $recipient_user ) && ! $admin_with_suspension_disallowed ) {
$recipient_actions['suspend'] = array(
'url' => self::get_recipient_change_status_link( $subscription_id, 'on-hold', $recipient_user->ID, $current_status ),
'name' => __( 'Suspend', 'woocommerce-subscriptions' ),
);
} elseif ( $subscription->can_be_updated_to( 'active' ) && ! $subscription->needs_payment() ) {
$recipient_actions['reactivate'] = array(
'url' => self::get_recipient_change_status_link( $subscription_id, 'active', $recipient_user->ID, $current_status ),
'name' => __( 'Reactivate', 'woocommerce-subscriptions' ),
);
}
if ( $subscription->can_be_updated_to( 'cancelled' ) ) {
$recipient_actions['cancel'] = array(
'url' => self::get_recipient_change_status_link( $subscription_id, 'cancelled', $recipient_user->ID, $current_status ),
'name' => __( 'Cancel', 'woocommerce-subscriptions' ),
);
}
$actions = array_merge( $recipient_actions, $actions );
// Remove the ability for recipients to change the payment method.
unset( $actions['change_payment_method'] );
}
return $actions;
}
/**
* Disables the early renewal modal for recipients. This is to prevent recipients from renewing using the purchaser's
* payment information.
* This is only required when running on WCS < 3.0.5, where being able to renew early implies access to the early renewal modal.
*
* @since 7.8.0 - Originally implemented in WooCommerce Subscriptions Gifting 2.1.1.
*/
public static function maybe_disable_early_renewal_modal_for_recipient() {
if ( ! wcsg_is_wc_subscriptions_pre( '3.0.5' ) ) {
return;
}
if ( ! wcs_is_view_subscription_page() || ! isset( $GLOBALS['wp']->query_vars['view-subscription'] ) ) {
return;
}
$subscription = wcs_get_subscription( absint( $GLOBALS['wp']->query_vars['view-subscription'] ) );
if ( ! $subscription || ! WCS_Gifting::is_gifted_subscription( $subscription ) || get_current_user_id() === $subscription->get_user_id() ) {
return;
}
$callback = array( 'WCS_Early_Renewal_Modal_Handler', 'maybe_print_early_renewal_modal' );
remove_action( 'woocommerce_subscription_details_table', $callback, has_action( 'woocommerce_subscription_details_table', $callback ) );
}
/**
* Generates a link for the user to change the status of a subscription
*
* @param int $subscription_id Subscription ID.
* @param string $status The status the recipient has requested to change the subscription to.
* @param int $recipient_id Recipient ID.
* @param string $current_status Current status.
*/
private static function get_recipient_change_status_link( $subscription_id, $status, $recipient_id, $current_status ) {
$action_link = add_query_arg(
array(
'subscription_id' => $subscription_id,
'change_subscription_to' => $status,
'wcsg_requesting_recipient_id' => $recipient_id,
)
);
$action_link = wp_nonce_url( $action_link, $subscription_id . $current_status );
return $action_link;
}
/**
* Checks if a status change request is by the recipient, and if it is,
* validate the request and proceed to change to the subscription.
*/
public static function change_user_recipient_subscription() {
// phpcs:disable WordPress.Security.NonceVerification.Recommended
// Check if the request is being made from the recipient (wcsg_requesting_recipient_id is set).
if ( isset( $_GET['wcsg_requesting_recipient_id'] ) && isset( $_GET['change_subscription_to'] ) && isset( $_GET['subscription_id'] ) && ! empty( $_GET['_wpnonce'] ) ) {
remove_action( 'init', 'WCS_User_Change_Status_Handler::maybe_change_users_subscription', 100 );
$subscription = wcs_get_subscription( absint( $_GET['subscription_id'] ) );
$user_id = $subscription->get_user_id();
$new_status = $_GET['change_subscription_to']; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash
if ( WCS_User_Change_Status_Handler::validate_request( $user_id, $subscription, $new_status, $_GET['_wpnonce'] ) ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash
WCS_User_Change_Status_Handler::change_users_subscription( $subscription, $new_status );
wp_safe_redirect( $subscription->get_view_order_url() );
exit;
}
}
// phpcs:enable
}
/**
* Allows the recipient to suspend a subscription, provided the suspension count hasnt been reached
*
* @param bool $user_can_suspend Whether the user can suspend a subscription.
* @param WC_Subscription $subscription Subscription object.
*/
public static function recipient_can_suspend( $user_can_suspend, $subscription ) {
if ( WCS_Gifting::is_gifted_subscription( $subscription ) && get_current_user_id() == WCS_Gifting::get_recipient_user( $subscription ) ) { // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
// Make sure subscription suspension count hasn't been reached.
$suspension_count = wcsg_get_objects_property( $subscription, 'suspension_count' );
$allowed_suspensions = get_option( WC_Subscriptions_Admin::$option_prefix . '_max_customer_suspensions', 0 );
if ( 'unlimited' === $allowed_suspensions || $allowed_suspensions > $suspension_count ) { // 0 not > anything so prevents a customer ever being able to suspend
$user_can_suspend = true;
}
}
return $user_can_suspend;
}
/**
* Adds all the subscriptions that have been gifted to a user to their subscriptions
*
* @param array $subscriptions An array of subscriptions assigned to the user.
* @param int $user_id Recipient's user ID.
* @return array An updated array of subscriptions with any subscriptions gifted to the user added.
*/
public static function get_users_subscriptions( $subscriptions, $user_id ) {
// Get the subscription posts that have been gifted to this user.
$recipient_subscriptions = self::get_recipient_subscriptions( $user_id );
foreach ( $recipient_subscriptions as $subscription_id ) {
$subscriptions[ $subscription_id ] = wcs_get_subscription( $subscription_id );
}
if ( 0 < count( $recipient_subscriptions ) ) {
krsort( $subscriptions );
}
return $subscriptions;
}
/**
* Adds recipient/purchaser information to the view subscription page.
*
* @param WC_Subscription $subscription Subscription object.
*/
public static function gifting_information_after_customer_details( $subscription ) {
// check if the subscription is gifted.
if ( WCS_Gifting::is_gifted_subscription( $subscription ) ) {
$customer_user_id = $subscription->get_user_id();
$recipient_user_id = WCS_Gifting::get_recipient_user( $subscription );
$current_user_id = get_current_user_id();
if ( $current_user_id == $customer_user_id ) { // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
wc_get_template(
'html-view-subscription-gifting-information.php',
array(
'user_title' => 'Recipient',
'name' => WCS_Gifting::get_user_display_name( $recipient_user_id ),
),
'',
plugin_dir_path( WC_Subscriptions::$plugin_file ) . 'templates/gifting/'
);
} else {
wc_get_template(
'html-view-subscription-gifting-information.php',
array(
'user_title' => 'Purchaser',
'name' => WCS_Gifting::get_user_display_name( $customer_user_id ),
),
'',
plugin_dir_path( WC_Subscriptions::$plugin_file ) . 'templates/gifting/'
);
}
}
}
/**
* Gets an array of subscription ids which have been gifted to a user
*
* @param int $user_id The user id of the recipient.
* @param int $order_id The Order ID which contains the subscription.
* @param array $args Array of arguments.
*
* @return int[] An array of subscription IDs gifted to the user
*/
public static function get_recipient_subscriptions( $user_id, $order_id = 0, $args = array() ) {
$args = wp_parse_args(
$args,
array(
'subscriptions_per_page' => -1,
'subscription_status' => 'any',
'orderby' => 'start_date',
'order' => 'DESC',
'meta_query' => array( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query
array(
'key' => '_recipient_user',
'value' => $user_id,
'compare' => '=',
),
),
)
);
if ( 0 != $order_id ) { // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
$args['order_id'] = $order_id;
}
return array_keys( wcs_get_subscriptions( $args ) );
}
/**
* Filter the WC_Subscription::get_related_orders() method removing parent orders for recipients.
*
* @param array $related_orders An array of order ids related to the $subscription.
* @param WC_Subscription $subscription Subscription object.
* @return array an array of order ids related to the $subscription.
*/
public static function maybe_remove_parent_order( $related_orders, $subscription ) {
if ( WCS_Gifting::is_gifted_subscription( $subscription ) && get_current_user_id() == WCS_Gifting::get_recipient_user( $subscription ) ) { // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
$parent_order_id = $subscription->get_parent_id();
if ( isset( $related_orders[ $parent_order_id ] ) ) {
unset( $related_orders[ $parent_order_id ] );
}
}
return $related_orders;
}
/**
* Maybe add recipient information to order item meta for displaying in order item tables.
*
* @param int $item_id The item ID.
* @param array $cart_item The cart's item.
*/
public static function maybe_add_recipient_order_item_meta( $item_id, $cart_item ) {
$recipient_user_id = WCSG_Cart::get_recipient_from_cart_item( $cart_item );
if ( $recipient_user_id ) {
wc_update_order_item_meta( $item_id, 'wcsg_recipient', 'wcsg_recipient_id_' . $recipient_user_id );
// Clear the order item meta cache so all meta is included in emails sent on checkout.
$cache_key = WC_Cache_Helper::get_cache_prefix( 'orders' ) . 'item_meta_array_' . $item_id;
wp_cache_delete( $cache_key, 'orders' );
}
}
/**
* Format the order item meta label to be displayed.
*
* @param string $label The item meta label displayed.
* @param string $name The name of the order item meta (key).
*/
public static function format_recipient_meta_label( $label, $name ) {
if ( 'wcsg_recipient' === $name || 'wcsg_deleted_recipient_data' === $name ) {
$label = __( 'Recipient', 'woocommerce-subscriptions' );
}
return $label;
}
/**
* Format recipient order item meta value by extracting the recipient user id.
*
* @param mixed $value Order item meta value.
*/
public static function format_recipient_meta_value( $value ) {
if ( false !== strpos( $value, 'wcsg_recipient_id' ) ) {
$recipient_id = substr( $value, strlen( 'wcsg_recipient_id_' ) );
$strip_tags = is_checkout() && ! is_wc_endpoint_url( 'order-received' );
return WCS_Gifting::get_user_display_name( $recipient_id, $strip_tags );
} elseif ( false !== strpos( $value, 'wcsg_deleted_recipient_data' ) ) {
$recipient_data = json_decode( substr( $value, strlen( 'wcsg_deleted_recipient_data_' ) ), true );
return $recipient_data['display_name'];
}
return $value;
}
/**
* Prevents default display of recipient meta in admin panel.
*
* @param array $ignored_meta_keys An array of order item meta keys which are skipped when displaying meta.
*/
public static function hide_recipient_order_item_meta( $ignored_meta_keys ) {
array_push( $ignored_meta_keys, 'wcsg_recipient', 'wcsg_deleted_recipient_data' );
return $ignored_meta_keys;
}
/**
* Displays recipient order item meta for admin panel.
*
* @param int $item_id The id of the order item.
*/
public static function display_recipient_meta_admin( $item_id ) {
$recipient_meta = wc_get_order_item_meta( $item_id, 'wcsg_recipient' );
$deleted_recipient_meta = wc_get_order_item_meta( $item_id, 'wcsg_deleted_recipient_data' );
$recipient_shipping_address = '';
$recipient_display_name = '';
if ( ! empty( $recipient_meta ) ) {
$recipient_id = substr( $recipient_meta, strlen( 'wcsg_recipient_id_' ) );
$recipient_shipping_address = WC()->countries->get_formatted_address( WCS_Gifting::get_users_shipping_address( $recipient_id ) );
$recipient_display_name = WCS_Gifting::get_user_display_name( $recipient_id );
} elseif ( ! empty( $deleted_recipient_meta ) ) {
$recipient_data = json_decode( substr( $deleted_recipient_meta, strlen( 'wcsg_deleted_recipient_data_' ) ), true );
$recipient_display_name = $recipient_data['display_name'];
unset( $recipient_data['display_name'] );
$recipient_shipping_address = WC()->countries->get_formatted_address( $recipient_data );
}
if ( ! empty( $recipient_meta ) || ! empty( $deleted_recipient_meta ) ) {
if ( empty( $recipient_shipping_address ) ) {
$recipient_shipping_address = 'N/A';
}
$tooltip_content = '';
$tooltip_content .= __( 'Shipping:', 'woocommerce-subscriptions' );
$tooltip_content .= ' ';
$tooltip_content .= $recipient_shipping_address;
echo '<br />';
echo '<b>' . esc_html__( 'Recipient:', 'woocommerce-subscriptions' ) . '</b> ' . wp_kses( $recipient_display_name, wp_kses_allowed_html( 'user_description' ) );
echo '<img class="help_tip" data-tip="' . wc_sanitize_tooltip( $tooltip_content ) . '" src="' . esc_url( WC()->plugin_url() ) . '/assets/images/help.png" height="16" width="16" />'; // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
}
}
/**
* Removes recipient subscription meta from gifted subscriptions if the recipient is deleted.
*
* @param int $user_id The id of the user being deleted.
*/
public static function maybe_remove_recipient( $user_id ) {
$gifted_items = WCS_Gifting::get_recipient_order_items( $user_id );
if ( ! empty( $gifted_items ) ) {
$recipient_data = wp_json_encode(
array_merge(
array( 'display_name' => addslashes( WCS_Gifting::get_user_display_name( $user_id ) ) ),
WCS_Gifting::get_users_shipping_address( $user_id )
)
);
foreach ( $gifted_items as $gifted_item ) {
if ( ! wcs_is_subscription( $gifted_item['order_id'] ) ) {
wc_update_order_item_meta( $gifted_item['order_item_id'], 'wcsg_deleted_recipient_data', 'wcsg_deleted_recipient_data_' . $recipient_data );
}
wc_delete_order_item_meta( $gifted_item['order_item_id'], 'wcsg_recipient', 'wcsg_recipient_id_' . $user_id );
}
}
}
/**
* Displays a warning message if a recipient is in the process of being deleted.
*/
public static function maybe_display_delete_recipient_warning() {
$recipient_users = array();
$user_ids = array();
// phpcs:disable WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash
if ( empty( $_REQUEST['users'] ) && ! empty( $_REQUEST['user'] ) ) {
$user_ids = array( $_REQUEST['user'] );
} else {
$user_ids = $_REQUEST['users'];
}
// phpcs:enable
if ( ! empty( $user_ids ) ) {
foreach ( $user_ids as $user_id ) {
$gifted_subscriptions = self::get_recipient_subscriptions( $user_id );
if ( 0 !== count( $gifted_subscriptions ) ) {
$recipient_users[ $user_id ] = $gifted_subscriptions;
}
}
$recipients_count = count( $recipient_users );
if ( 0 !== $recipients_count ) {
echo '<p><strong>' . esc_html__( 'WARNING:', 'woocommerce-subscriptions' ) . ' </strong>';
echo esc_html( _n( 'The following recipient will be removed from their subscriptions:', 'The following recipients will be removed from their subscriptions:', $recipients_count, 'woocommerce-subscriptions' ) );
echo '<p><dl>';
foreach ( $recipient_users as $recipient_id => $subscriptions ) {
$recipient = get_userdata( $recipient_id );
echo '<dt>ID #' . esc_attr( $recipient_id ) . ': ' . esc_attr( $recipient->user_login ) . '</dt>';
foreach ( $subscriptions as $subscription_id ) {
$subscription = wcs_get_subscription( $subscription_id );
echo '<dd>' . esc_html__( 'Subscription', 'woocommerce-subscriptions' ) . ' <a href="' . esc_url( wcs_get_edit_post_link( wcsg_get_objects_id( $subscription ) ) ) . '">#' . esc_html( $subscription->get_order_number() ) . '</a></dd>';
}
}
echo '</dl>';
}
}
}
/**
* On password reset, if the user needs to update account, sets a (temporary) flag
*
* @param WP_User $user User object.
*
* @since 7.8.0 - Originally implemented in WooCommerce Subscriptions Gifting 2.1.0.
*/
public static function maybe_add_recipient_reset_password_flag( $user ) {
if ( 'true' === get_user_meta( $user->ID, 'wcsg_update_account', true ) ) {
update_user_meta( $user->ID, 'wcsg_recipient_just_reset_password', 'true' );
}
}
/**
* Does the user require a new password after password reset?
*
* @param Int $user_id User ID we want to validate.
*
* @return bool
* @since 7.8.0 - Originally implemented in WooCommerce Subscriptions Gifting 2.1.0.
*/
public static function user_requires_new_password( $user_id ) {
return ! metadata_exists( 'user', $user_id, 'wcsg_recipient_just_reset_password' );
}
/**
* On subscription status changes, maybe update the role of the subscription recipient (if set) depending on the new subscription status.
* Sets the recipient user to the inactive subscriber role on on-hold, cancelled, expired statuses and an active subscriber role on active statuses.
*
* @param WC_Subscription $subscription Subscription object.
* @param string $new_status The subscription's new status.
*/
public static function maybe_update_recipient_role( $subscription, $new_status ) {
$inactive_statuses = array(
'on-hold',
'cancelled',
'expired',
);
if ( WCS_Gifting::is_gifted_subscription( $subscription ) ) {
$recipient_user_id = WCS_Gifting::get_recipient_user( $subscription );
if ( in_array( $new_status, $inactive_statuses, true ) ) {
wcs_maybe_make_user_inactive( $recipient_user_id );
} elseif ( 'active' === $new_status ) {
wcs_make_user_active( $recipient_user_id );
}
}
}
/**
* When orders are processed/completed, create new recipients and attach shipping information to gifted subscriptions.
*
* @param int $order_id Order ID.
*/
public static function maybe_create_recipient( $order_id ) {
$subscriptions = wcs_get_subscriptions_for_order( $order_id );
foreach( $subscriptions as $subscription ) {
self::maybe_create_recipient_and_attach_shipping_information( $subscription );
}
}
/**
* Maybe create a recipient user and attach shipping information to a subscription.
*
* @param WC_Subscription $subscription The subscription object.
*/
public static function maybe_create_recipient_and_attach_shipping_information( $subscription ) {
$recipient_user_email_address = $subscription->get_meta( '_recipient_user_email_address' );
if ( ! $recipient_user_email_address ) {
return;
}
$recipient_user_id = email_exists( $recipient_user_email_address );
// Create a new user if the recipient's email doesn't already exist.
if ( ! $recipient_user_id ) {
$recipient_user_id = WCS_Gifting::create_recipient_user( $recipient_user_email_address );
}
if ( ! is_numeric( $recipient_user_id ) ) {
return;
}
WCS_Gifting::set_recipient_user( $subscription, $recipient_user_id );
$subscription->set_shipping_first_name( get_user_meta( $recipient_user_id, 'shipping_first_name', true ) );
$subscription->set_shipping_last_name( get_user_meta( $recipient_user_id, 'shipping_last_name', true ) );
$subscription->set_shipping_company( get_user_meta( $recipient_user_id, 'shipping_company', true ) );
$subscription->set_shipping_address_1( get_user_meta( $recipient_user_id, 'shipping_address_1', true ) );
$subscription->set_shipping_address_2( get_user_meta( $recipient_user_id, 'shipping_address_2', true ) );
$subscription->set_shipping_city( get_user_meta( $recipient_user_id, 'shipping_city', true ) );
$subscription->set_shipping_state( get_user_meta( $recipient_user_id, 'shipping_state', true ) );
$subscription->set_shipping_postcode( get_user_meta( $recipient_user_id, 'shipping_postcode', true ) );
$subscription->set_shipping_country( get_user_meta( $recipient_user_id, 'shipping_country', true ) );
$subscription->save();
}
/**
* Attach WooCommerce version dependent hooks
*
* @since 7.8.0 - Originally implemented in WooCommerce Subscriptions Gifting 1.0.1.
* @deprecated 2.0.0
*/
public static function attach_dependant_hooks() {
_deprecated_function( __METHOD__, '2.0.0', __CLASS__ . '::init()' );
}
}