llms_setup_pending_order( array $data = array() )
Setup a pending order which can be passed to an LLMS_Payment_Gateway for processing.
Parameters Parameters
- $data
-
(array) (Optional) Data used to create a pending order.
- 'plan_id'
(int) (Required) LLMS_Access_Plan ID. - 'customer'
(array) (Required). Array of customer information formatted to be passed toLLMS_Person_Handler::update()
orllms_register_user()
- 'agree_to_terms'
(string) (Required ifllms_are_terms_and_conditions_required()
are required) If terms & conditions are required this should be "yes" for agreement. - 'payment_gateway'
(string) (Optional) ID of a registered LLMS_Payment_Gateway which will be used to process the order. - 'coupon_code'
(string) (Optional) Coupon code to be applied to the order.
Default value: array()
- 'plan_id'
Return Return
(array)
Source Source
File: includes/functions/llms.functions.order.php
* @type string agree_to_terms (Required if `llms_are_terms_and_conditions_required()` are required) If terms & conditions are required this should be "yes" for agreement. * @type string payment_gateway (Optional) ID of a registered LLMS_Payment_Gateway which will be used to process the order. * @type string coupon_code (Optional) Coupon code to be applied to the order. * } * @return array */ function llms_setup_pending_order( $data = array() ) { /** * Filters the order data before setting up the pending order. * * @since Unknown. * * @param array $data Array of input data from a checkout form. */ $data = apply_filters( 'llms_before_setup_pending_order', $data ); // Request keys that can be submitted with or without the `llms_` prefix. $keys = array( 'llms_agree_to_terms', 'llms_coupon_code', 'llms_plan_id', ); foreach ( $keys as $key ) { if ( isset( $data[ $key ] ) ) { $data[ str_replace( 'llms_', '', $key ) ] = $data[ $key ]; } } $err = new WP_Error(); // Check t & c if configured. if ( llms_are_terms_and_conditions_required() ) { if ( ! isset( $data['agree_to_terms'] ) || ! llms_parse_bool( $data['agree_to_terms'] ) ) { $err->add( 'terms-violation', sprintf( __( 'You must agree to the %s to continue.', 'lifterlms' ), get_the_title( get_option( 'lifterlms_terms_page_id' ) ) ) ); return $err; } } // We must have a plan_id to proceed. if ( empty( $data['plan_id'] ) ) { $err->add( 'missing-plan-id', __( 'Missing an Access Plan ID.', 'lifterlms' ) ); return $err; } // Validate the plan is a real plan. $plan = llms_get_post( absint( $data['plan_id'] ) ); if ( ! $plan || 'llms_access_plan' !== $plan->get( 'type' ) ) { $err->add( 'invalid-plan-id', __( 'Invalid Access Plan ID.', 'lifterlms' ) ); return $err; } // Used later. $coupon_id = null; $coupon = false; // If a coupon is being used, validate it. if ( ! empty( $data['coupon_code'] ) ) { $data['coupon_code'] = sanitize_text_field( $data['coupon_code'] ); $coupon_id = llms_find_coupon( $data['coupon_code'] ); // Coupon couldn't be found. if ( ! $coupon_id ) { $err->add( 'coupon-not-found', sprintf( __( 'Coupon code "%s" not found.', 'lifterlms' ), $data['coupon_code'] ) ); return $err; } // Coupon is real, make sure it's valid for the current plan. $coupon = llms_get_post( $coupon_id ); $valid = $coupon->is_valid( $data['plan_id'] ); // If the coupon has a validation error, return an error message. if ( is_wp_error( $valid ) ) { $err->add( 'invalid-coupon', $valid->get_error_message() ); return $err; } } // If payment is required, verify we have a gateway. if ( $plan->requires_payment( $coupon_id ) && empty( $data['payment_gateway'] ) ) { $err->add( 'missing-gateway-id', __( 'No payment method selected.', 'lifterlms' ) ); return $err; } $gateway_id = empty( $data['payment_gateway'] ) ? 'manual' : $data['payment_gateway']; $gateway_error = llms_can_gateway_be_used_for_plan( $gateway_id, $plan ); if ( is_wp_error( $gateway_error ) ) { return $gateway_error; } if ( empty( $data['customer'] ) ) { $err->add( 'missing-customer', __( 'Missing customer information.', 'lifterlms' ) ); return $err; } // Update the customer. if ( ! empty( $data['customer']['user_id'] ) ) { $person_id = llms_update_user( $data['customer'], 'checkout', compact( 'plan' ) ); } else { $person_id = llms_register_user( $data['customer'], 'checkout', true, compact( 'plan' ) ); } // Validation or registration issues. if ( is_wp_error( $person_id ) ) { return $person_id; } // This will likely never actually happen unless there's something very strange afoot. if ( ! is_numeric( $person_id ) ) { $err->add( 'account-creation', __( 'An unknown error occurred when attempting to create an account, please try again.', 'lifterlms' ) ); return $err; } // Ensure the new user isn't enrolled in the product being purchased. if ( llms_is_user_enrolled( $person_id, $plan->get( 'product_id' ) ) ) { $product = $plan->get_product(); $err->add( 'already-enrolled', sprintf( // Translators: %2$s = The product type (course/membership); %1$s = product permalink. __( 'You already have access to this %2$s! Visit your dashboard <a href="%1$s">here.</a>', 'lifterlms' ), llms_get_page_url( 'myaccount' ), $product->get_post_type_label() ) ); // Prevent double displaying a notice to already enrolled students in the product being purchased. add_filter( 'llms_display_checkout_form_enrolled_students_notice', '__return_false' ); return $err; } $person = llms_get_student( $person_id ); $gateway = llms()->payment_gateways()->get_gateway_by_id( $gateway_id ); /** * Filter the return of pending order setup data. * * @since 3.30.1 * * @param array $setup { * Data used to create the pending order. * * @type LLMS_Student $person Student object. * @type LLMS_Access_Plan $plan Access plan object. * @type LLMS_Payment_Gateway $gateway Instance of the selected gateway. * @type LLMS_Coupon|false $coupon Coupon object or false if none used.
Expand full source code Collapse full source code View on GitHub
Changelog Changelog
Version | Description |
---|---|
5.0.0 | Use llms_update_user() instead of deprecated LLMS_Person_Handler::update() . |
4.21.1 | Sanitize coupon code prior to outputting it in error messages. |
4.2.0 | Prevent double displaying a notice to already enrolled students in the product being purchased. |
3.29.0 | Introduced. |