LLMS_Controller_Orders::recurring_charge( int $order_id )
Trigger a recurring payment.
Description Description
Called by action scheduler.
Parameters Parameters
- $order_id
-
(int) (Required) WP Post ID of the order.
Return Return
(bool) false if the recurring charge cannot be processed, true when the charge is successfully handed off to the gateway.
Source Source
File: includes/controllers/class.llms.controller.orders.php
*/
public function pending_cancel_order( $order ) {
$date = $order->get_next_payment_due_date( 'Y-m-d H:i:s' );
$order->set( 'date_access_expires', $date );
$order->unschedule_recurring_payment();
$order->maybe_schedule_expiration();
}
/**
* Trigger a recurring payment.
*
* Called by action scheduler.
*
* @since 3.0.0
* @since 3.32.0 Record order notes and trigger actions during errors.
* @since 3.36.1 Made sure to process only proper LLMS_Orders of existing users.
* @since 5.2.0 Fixed buggy logging on gateway error because it doesn't support recurring payments.
* @since 5.4.0 Handle case when the order's related product has been removed.
*
* @param int $order_id WP Post ID of the order.
* @return bool `false` if the recurring charge cannot be processed, `true` when the charge is successfully handed off to the gateway.
*/
public function recurring_charge( $order_id ) {
// Make sure the order still exists.
$order = llms_get_post( $order_id );
if ( ! $order || ! is_a( $order, 'LLMS_Order' ) ) {
/**
* Fired when a LifterLMS order's recurring charge errors because the order doesn't exist anymore
*
* @since Unknown
*
* @param int $order_id WP Post ID of the order.
* @param LLMS_Controller_Orders $controller This controller's instance.
*/
do_action( 'llms_order_recurring_charge_order_error', $order_id, $this );
llms_log( sprintf( 'Recurring charge for Order #%d could not be processed because the order no longer exists.', $order_id ), 'recurring-payments' );
return false;
}
// Check the user still exists.
$user_id = $order->get( 'user_id' );
if ( ! get_user_by( 'id', $user_id ) ) {
/**
* Fired when a LifterLMS order's recurring charge errors because the user who placed the order doesn't exist anymore
*
* @since Unknown
*
* @param int $order_id WP Post ID of the order.
* @param int $user_id WP User ID of the user who placed the order.
* @param LLMS_Controller_Orders $controller This controller's instance.
*/
do_action( 'llms_order_recurring_charge_user_error', $order_id, $user_id, $this );
llms_log( sprintf( 'Recurring charge for Order #%1$d could not be processed because the user (#%2$d) no longer exists.', $order_id, $user_id ), 'recurring-payments' );
// Translators: %d = The deleted user's ID.
$order->add_note( sprintf( __( 'Recurring charge skipped. The user (#%d) no longer exists.', 'lifterlms' ), $user_id ) );
return false;
}
// Ensure Gateway is still available.
$gateway = $order->get_gateway();
if ( is_wp_error( $gateway ) ) {
/**
* Fired when a LifterLMS order's recurring charge errors because of a gateway error. E.g. it's not available anymore.
*
* @since Unknown
*
* @param int $order_id WP Post ID of the order.
* @param WP_Error $error WP_Error instance.
* @param LLMS_Controller_Orders $controller This controller's instance.
*/
do_action( 'llms_order_recurring_charge_gateway_error', $order_id, $gateway, $this );
llms_log(
sprintf(
'Recurring charge for Order #%1$d could not be processed because the "%2$s" gateway is no longer available. Gateway Error: %3$s',
$order_id,
$order->get( 'payment_gateway' ),
$gateway->get_error_message()
),
'recurring-payments'
);
$order->add_note(
sprintf(
// Translators: %s = error message encountered while loading the gateway.
__( 'Recurring charge was not processed due to an error encountered while loading the payment gateway: %s.', 'lifterlms' ),
$gateway->get_error_message()
)
);
return false;
}
// Gateway doesn't support recurring payments.
if ( ! $gateway->supports( 'recurring_payments' ) ) {
/**
* Fired when a LifterLMS order's recurring charge errors because the selected gateway doesn't support recurring payments.
*
* @since Unknown
*
* @param int $order_id WP Post ID of the order.
* @param LLMS_Payment_Gateway $gateway LLMS_Payment_Gateway extending class instance.
* @param LLMS_Controller_Orders $controller This controller's instance.
*/
do_action( 'llms_order_recurring_charge_gateway_payments_disabled', $order_id, $gateway, $this );
llms_log(
sprintf(
'Recurring charge for order #%d could not be processed because the gateway no longer supports recurring payments.',
$order_id
),
'recurring-payments'
);
$order->add_note( __( 'Recurring charge skipped because recurring payments are disabled for the payment gateway.', 'lifterlms' ) );
return false;
}
// Recurring payments disabled as a site feature when in staging mode.
if ( ! LLMS_Site::get_feature( 'recurring_payments' ) ) {
/**
* Fired when a LifterLMS order's recurring charge errors because the recurring payments site feature is disabled.
*
* @since Unknown
*
* @param int $order_id WP Post ID of the order.
* @param LLMS_Payment_Gateway $gateway LLMS_Payment_Gateway extending class instance.
* @param LLMS_Controller_Orders $controller This controller's instance.
*/
do_action( 'llms_order_recurring_charge_skipped', $order_id, $gateway, $this );
$order->add_note( __( 'Recurring charge skipped because recurring payments are disabled in staging mode.', 'lifterlms' ) );
return false;
}
// Related product removed.
if ( empty( $order->get_product() ) ) {
/**
* Fired when a LifterLMS order's recurring charge errors because the purchased product (Course/Membership) doesn't exist anymore.
*
Expand full source code Collapse full source code View on GitHub
Changelog Changelog
| Version | Description |
|---|---|
| 5.4.0 | Handle case when the order's related product has been removed. |
| 5.2.0 | Fixed buggy logging on gateway error because it doesn't support recurring payments. |
| 3.36.1 | Made sure to process only proper LLMS_Orders of existing users. |
| 3.32.0 | Record order notes and trigger actions during errors. |
| 3.0.0 | Introduced. |