autoship_create_scheduled_order_link_handler (function)

(src/scheduled-orders.php) Used to process the Create Scheduled Order link data. It takes the $link (array) as a parameter and returns a boolean or WP_Error.

Function

/**
 * Processes the Create 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_create_scheduled_order_link_handler( $link ){

  // The General notice is used for any link failures not related to coupons
  $general_notice = apply_filters( 'autoship_create_scheduled_order_link_invalid',
  __( 'The supplied link is no longer valid or has expired.', "autoship" ),
  $link );

  do_action( 'autoship_initiate_create_scheduled_order_link_handler', $link );

  if ( !isset( $link['customer_id'] ) )
  return new WP_Error( 'invalid_or_expired_link', $general_notice );

  $customer_id = $link['customer_id'];
  $args = array();

  // Check for frequency
  if ( isset( $link['frequency'] ) )
  $args['frequency'] = $link['frequency'];

  // Check for frequency type
  if ( isset( $link['frequency_type'] ) )
  $args['frequencyType'] = $link['frequency_type'];

  // Check for frequency type
  if ( isset( $link['next_occurrence'] ) )
  $args['nextOccurrenceUtc'] = $link['next_occurrence'];

  // Check for Products / Line Items
  if ( isset( $link['products'] ) && !empty( $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_create_scheduled_order_endpoint_valid_products_params',
    array( 'productIds' => array_keys( $link['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.
      $args['scheduledOrderItems'] = array();
      foreach ($available_products as $key => $value) {

        if ( !isset( $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'  => $link['products'][$value->id]
        ), $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'];
        }

        $args['scheduledOrderItems'][] = $line;

      }

    }

  }

  // Allow a final filter for last adjustments & customizations
  $args = apply_filters( 'autoship_create_scheduled_order_endpoint_order_args', $args, $link );

  // Make the call to create the order.
  $result = autoship_create_scheduled_order( $customer_id, $args );

  return $result;
}