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 to LLMS_Person_Handler::update() or llms_register_user()
  • 'agree_to_terms'
    (string) (Required if llms_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()


Top ↑

Return Return

(array)


Top ↑

Source Source

File: includes/functions/llms.functions.order.php

299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
*     @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.


Top ↑

Changelog 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.

Top ↑

User Contributed Notes User Contributed Notes

You must log in before being able to contribute a note or feedback.