LLMS_Payment_Gateway_Manual
Manual Payment Gateway Class
Source Source
File: includes/class.llms.gateway.manual.php
class LLMS_Payment_Gateway_Manual extends LLMS_Payment_Gateway {
/**
* @var string
* @since 3.0.0
*/
public $payment_instructions;
/**
* Constructor
*
* @return void
* @since 3.0.0
* @version 3.10.0
*/
public function __construct() {
$this->id = 'manual';
$this->admin_description = __( 'Collect manual or offline payments. Also handles any free orders during checkout.', 'lifterlms' );
$this->admin_title = __( 'Manual', 'lifterlms' );
$this->title = __( 'Manual', 'lifterlms' );
$this->description = __( 'Pay manually via check', 'lifterlms' );
$this->payment_instructions = ''; // Fields.
$this->supports = array(
'checkout_fields' => false,
'refunds' => false, // Manual refunds are available always for all gateways and are not handled by this class.
'single_payments' => true,
'recurring_payments' => true,
'test_mode' => false,
);
add_filter( 'llms_get_gateway_settings_fields', array( $this, 'get_settings_fields' ), 10, 2 );
add_action( 'lifterlms_before_view_order_table', array( $this, 'before_view_order_table' ) );
}
/**
* Output payment instructions if the order is pending.
*
* @since 3.0.0
* @since 6.4.0 Allowed classes extended from this manual payment gateway class to display payment instructions.
*
* @return void
*/
public function before_view_order_table() {
global $wp;
if ( ! empty( $wp->query_vars['orders'] ) ) {
$order = new LLMS_Order( intval( $wp->query_vars['orders'] ) );
if (
$order->get( 'payment_gateway' ) === $this->id &&
in_array( $order->get( 'status' ), array( 'llms-pending', 'llms-on-hold', true ) )
) {
echo $this->get_payment_instructions();
}
}
}
/**
* Get fields displayed on the checkout form
*
* @return string
* @since 3.0.0
* @version 3.7.5
*/
public function get_payment_instructions() {
$opt = $this->get_option( 'payment_instructions' );
if ( $opt ) {
$fields = '<div class="llms-notice llms-info"><h3>' . esc_html__( 'Payment Instructions', 'lifterlms' ) . '</h3>' . wpautop( wptexturize( wp_kses_post( $opt ) ) ) . '</div>';
} else {
$fields = '';
}
return apply_filters( 'llms_get_payment_instructions', $fields, $this->id );
}
/**
* Get admin setting fields
*
* @param array $fields default fields
* @param string $gateway_id gateway ID
* @return array
* @since 3.0.0
* @version 3.0.0
*/
public function get_settings_fields( $fields, $gateway_id ) {
if ( $this->id !== $gateway_id ) {
return $fields;
}
$fields[] = array(
'id' => $this->get_option_name( 'payment_instructions' ),
'desc' => '<br>' . __( 'Displayed to the user when this gateway is selected during checkout. Add information here instructing the student on how to send payment.', 'lifterlms' ),
'title' => __( 'Payment Instructions', 'lifterlms' ),
'type' => 'textarea',
);
return $fields;
}
/**
* Called when the Update Payment Method form is submitted from a single order view on the student dashboard
*
* Gateways should do whatever the gateway needs to do to validate the new payment method and save it to the order
* so that future payments on the order will use this new source
*
* @param obj $order Instance of the LLMS_Order
* @param array $form_data Additional data passed from the submitted form (EG $_POST)
* @return void
* @since 3.10.0
* @version 3.10.0
*/
public function handle_payment_source_switch( $order, $form_data = array() ) {
$previous_gateway = $order->get( 'payment_gateway' );
if ( $this->get_id() === $previous_gateway ) {
return;
}
$order->set( 'payment_gateway', $this->get_id() );
$order->set( 'gateway_customer_id', '' );
$order->set( 'gateway_source_id', '' );
$order->set( 'gateway_subscription_id', '' );
$order->add_note( sprintf( __( 'Payment method switched from "%1$s" to "%2$s"', 'lifterlms' ), $previous_gateway, $this->get_admin_title() ) );
}
/**
* Handle a Pending Order.
*
* @since 3.0.0
* @since 3.10.0 Unknown.
* @since 6.4.0 Use `llms_redirect_and_exit()` in favor of `wp_redirect()` and `exit()`.
*
* @param LLMS_Order $order Order object.
* @param LLMS_Access_Plan $plan Access plan object.
* @param LLMS_Student $student Student object.
* @param LLMS_Coupon|boolean $coupon Coupon object or `false` when no coupon is being used for the order.
* @return void
*/
public function handle_pending_order( $order, $plan, $student, $coupon = false ) {
// Free orders (no payment is due).
if ( floatval( 0 ) === $order->get_initial_price( array(), 'float' ) ) {
// Free access plans do not generate receipts.
if ( $plan->is_free() ) {
$order->set( 'status', 'llms-completed' );
// Free trial, reduced to free via coupon, etc....
// We do want to record a transaction and then generate a receipt.
} else {
// Record a $0.00 transaction to ensure a receipt is sent.
$order->record_transaction(
array(
'amount' => floatval( 0 ),
'source_description' => __( 'Free', 'lifterlms' ),
'transaction_id' => uniqid(),
'status' => 'llms-txn-succeeded',
'payment_gateway' => 'manual',
'payment_type' => 'single',
)
);
}
return $this->complete_transaction( $order );
}
/**
* Action triggered when a manual payment is due.
*
* @hooked LLMS_Notification: manual_payment_due - 10
*
* @since Unknown.
*
* @param LLMS_Order $order The order object.
* @param LLMS_Payment_Gateway_Manual $gateway Manual gateway instance.
*/
do_action( 'llms_manual_payment_due', $order, $this );
/**
* Action triggered when the pending order processing has been completed.
*
* @since Unknown.
*
* @param LLMS_Order $order The order object.
*/
do_action( 'lifterlms_handle_pending_order_complete', $order );
llms_redirect_and_exit( $order->get_view_link() );
}
/**
* Called by scheduled actions to charge an order for a scheduled recurring transaction
* This function must be defined by gateways which support recurring transactions
*
* @param obj $order Instance LLMS_Order for the order being processed
* @return mixed
* @since 3.10.0
* @version 3.10.0
*/
public function handle_recurring_transaction( $order ) {
// Switch to order on hold if it's a paid order.
if ( $order->get_price( 'total', array(), 'float' ) > 0 ) {
// Update status.
$order->set_status( 'on-hold' );
/**
* @hooked LLMS_Notification: manual_payment_due - 10
*/
do_action( 'llms_manual_payment_due', $order, $this );
}
}
/**
* Determine if the gateway is enabled according to admin settings checkbox
*
* @return boolean
* @since 3.0.0
* @version 3.0.0
*/
public function is_enabled() {
return ( 'yes' === $this->get_enabled() ) ? true : false;
}
}
Expand full source code Collapse full source code View on GitHub
Methods Methods
- __construct — Constructor
- before_view_order_table — Output payment instructions if the order is pending.
- get_payment_instructions — Get fields displayed on the checkout form
- get_settings_fields — Get admin setting fields
- handle_payment_source_switch — Called when the Update Payment Method form is submitted from a single order view on the student dashboard
- handle_pending_order — Handle a Pending Order.
- handle_recurring_transaction — Called by scheduled actions to charge an order for a scheduled recurring transaction This function must be defined by gateways which support recurring transactions
- is_enabled — Determine if the gateway is enabled according to admin settings checkbox
Changelog Changelog
| Version | Description |
|---|---|
| 3.30.3 | Explicitly define class properties. |
| 3.0.0 | Introduced. |