autoship_add_to_scheduled_order_link_handler (function)
(src/scheduled-orders.php) Used to process the Add to Scheduled Order Link data. It takes the $link (array) as a parameter and returns a boolean or WP_Error.
Function
/**
* Processes the Add to Scheduled Order Link Data
* @param array $link {
* The link param in an array
* @type int|array $products Array of woocommerce simple or variation ids or single id
* @type int $qty The qty to add
* @type int $min The min cycles
* @type int $max The max cycles
* @type int $frequency The frequency
* @type string $frequency_type The frequency type
* @type int $order The Autoship Scheduled Order ID
* @type string $coupon The coupon code
* @type string $customer_id The WC Customer ID hashed
* @type float $discount The discount amount ( SUPPLIED AS NULL )
* }
*
* @return bool|WP_Error True on Success, False if no scheduled order exists,
* WP_Error on failure
*/
function autoship_add_to_scheduled_order_link_handler( $link ){
// The General notice is used for any link failures not related to coupons
$general_notice = apply_filters( 'autoship_add_to_scheduled_order_link_invalid',
__( 'The supplied link is no longer valid or has expired.', "autoship" ),
$link );
do_action( 'autoship_initiate_add_to_scheduled_order_link_handler', $link );
// Check for Products / Line Items & validate them
if ( isset( $link['products'] ) && !empty( $link['products'] ) ){
$products = is_array( $link['products'] ) ? array_keys( $link['products'] ) : array( $link['products'] );
// Setup the Query Params for the QPilot call
// By default we search for only those ids that are enabled to be added to an order.
$valid_products = apply_filters( 'autoship_add_to_scheduled_order_endpoint_valid_products_params',
array( 'productIds' => $products ), $link );
// Make the Search call
$available_products = autoship_search_available_products( $valid_products );
if ( !is_wp_error( $available_products ) && !empty( $available_products ) ){
// Loop through the QPilot products and attach any needed info.
$link['items'] = array();
foreach ($available_products as $key => $value) {
if ( ( is_array( $link['products'] ) && !isset( $link['products'][$value->id] ) ) || ( !is_array( $link['products'] ) && $link['products'] != $value->id ) )
continue;
// Grab the prices - runs through the custom filter
$prices = autoship_get_product_prices( $value->id );
// Create the min-needed for a line item
// Devs can adjust on the fly using URL params
$line = apply_filters('autoship_create_scheduled_order_endpoint_item', array(
'productId' => $value->id,
'price' => $prices['regular_price'],
'salePrice' => $prices['autoship_recurring_price'],
'quantity' => is_array( $link['products'] ) ? $link['products'][$value->id] : $link['qty']
), $link );
// Check for Min Cycle Data
if ( isset( $link['min'] ) && is_array( $link['min'] ) ){
$line['minCycles'] = isset( $link['min'][$value->id] ) ? $link['min'][$value->id] : NULL;
} else if ( isset( $link['min'] ) ){
$line['minCycles'] = $link['min'];
}
// Check for Max Cycle Data
if ( isset( $link['max'] ) && is_array( $link['max'] ) ){
$line['maxCycles'] = isset( $link['max'][$value->id] ) ? $link['max'][$value->id] : NULL;
} else if ( isset( $link['max'] ) ){
$line['maxCycles'] = $link['max'];
}
// Validate Coupon and get discount
if ( isset( $link['coupon'] ) && !empty( $link['coupon'] ) ){
$coupon_notice = apply_filters( 'autoship_add_to_scheduled_order_link_invalid_coupon',
__( 'The supplied discount link is no longer valid or has expired.', "autoship" ),
$link );
// Grab the new discount price since there's a coupon
$link['discount'] = autoship_validate_and_get_autoship_coupon_discount( $link['coupon'], $line['productId'], apply_filters( 'autoship_add_to_scheduled_order_link_coupon_base_price', $line['price'], $line['salePrice'], $line, $link ), $line['quantity'], $line['minCycles'], $line['maxCycles'], $link['customer_id'] );
if ( is_wp_error( $link['discount'] ) )
return new WP_Error( 'invalid_or_expired_discount', $coupon_notice );
// Set the sale price to the new discount price if it exists
$line['salePrice'] = $link['discount'];
}
$link['items'][] = $line;
}
}
}
// If there are no valid items to add bail.
if ( !isset( $link['items'] ) || empty( $link['items'] ) )
return new WP_Error( 'invalid_or_expired_link', $general_notice );
// Allow Filters to adjust link data on the fly
$link = apply_filters( 'autoship_add_to_scheduled_order_link_values', $link, $products );
// Check if a specific order number is specified or a freq and frequency type.
// Else we add to the next order.
if ( ( isset( $link['order'] ) && !empty( $link['order'] ) ) ||
( isset( $link['frequency'] ) || isset( $link['frequency_type'] ) ) ) {
// Use specific order if specified.
if ( isset( $link['order'] ) && !empty( $link['order'] ) ){
// Since a specific id is supplied we need to validate it belongs to this user.
$order = autoship_get_scheduled_order( $link['order'] );
// Bail if no next order exists
// Also Check the customer info if an order is found.
if ( is_wp_error( $order ) || ( $order->customerId != $link['customer_id'] ) )
return false;
} else {
// Check the Frequency and Frequency Type and if populated we need to get the next order that matches.
$type_id = autoship_get_frequencytype_int ( $link['frequency_type'] );
// Bail if the frequency type doesn't exist
if ( false === $type_id )
return new WP_Error( 'invalid_or_expired_link', $general_notice );
// Get the next scheduled order
$order = autoship_get_next_scheduled_order( $link['customer_id'], $link['frequency'], $type_id );
// Bail if no next order exists
if ( is_wp_error( $order ) )
return false;
}
// Now add the items via the api
$updated = autoship_create_scheduled_order_items( $order->id, $link['items'] );
// Since the function returns true on success or WP_Error on false
// Check it.
$updated = is_wp_error( $updated ) ? $updated : $order->id;
} else {
// Call Autoships add to next scheduled order.
$updated = autoship_update_next_scheduled_order_with_items ( $link['customer_id'], $link['items'] );
// Special catch in case next order doesn't exist.
if ( is_wp_error( $updated ) )
return false;
}
return $updated;
}