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