LLMS_Shortcode_Checkout::output( array $atts )

Gather a bunch of information and output the actual content for the shortcode.


Parameters Parameters

$atts

(array) (Required) Shortcode atts from originating shortcode.


Top ↑

Return Return

(void)


Top ↑

Source Source

File: includes/shortcodes/class.llms.shortcode.checkout.php

162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
public static function output( $atts ) {
 
    global $wp;
 
    $atts = $atts ? $atts : array();
 
    $atts['cols'] = isset( $atts['cols'] ) ? $atts['cols'] : 2;
 
    self::$uid = get_current_user_id();
 
    $atts['gateways']         = llms()->payment_gateways()->get_enabled_payment_gateways();
    $atts['selected_gateway'] = llms()->payment_gateways()->get_default_gateway();
 
    $atts['order_key'] = '';
 
    $atts['field_data'] = array();
    if ( isset( $_POST ) && isset( $_POST['action'] ) && 'create_pending_order' === $_POST['action'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
        $atts['field_data'] = wp_unslash( $_POST ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
    } elseif ( self::$uid ) {
        $atts['field_data'] = get_current_user_id();
    }
 
    self::checkout_wrapper_start();
 
    /**
     * Allows gateways or third parties to output custom errors before
     * any core logic is executed.
     *
     * This filter returns `false` by default. To output custom errors return
     * the error message as a string that will be displayed on screen.
     *
     * @since Unknown
     *
     * @param bool|string $pre_error A custom error message.
     */
    $err = apply_filters( 'lifterlms_pre_checkout_error', false );
    if ( $err ) {
        self::error( $err );
        self::checkout_wrapper_end();
        return;
    }
 
    llms_print_notices();
 
    // purchase step 1.
    if ( isset( $_GET['plan'] ) && is_numeric( $_GET['plan'] ) ) {
 
        $plan_id = llms_filter_input( INPUT_GET, 'plan', FILTER_SANITIZE_NUMBER_INT );
 
        // Only retrieve if plan is a llms_access_plan and is published.
        if ( 0 === strcmp( get_post_status( $plan_id ), 'publish' ) && 0 === strcmp( get_post_type( $plan_id ), 'llms_access_plan' ) ) {
 
            $coupon = llms()->session->get( 'llms_coupon' );
 
            if ( isset( $coupon['coupon_id'] ) && isset( $coupon['plan_id'] ) ) {
                if ( $coupon['plan_id'] == $_GET['plan'] ) {
                    $atts['coupon'] = new LLMS_Coupon( $coupon['coupon_id'] );
                } else {
                    llms()->session->set( 'llms_coupon', false );
                    $atts['coupon'] = false;
                }
            } else {
                $atts['coupon'] = false;
            }
 
            // Use posted order key to resume a pending order.
            if ( isset( $_POST['llms_order_key'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
                $atts['order_key'] = llms_filter_input_sanitize_string( INPUT_POST, 'llms_order_key' );
 
                // Attempt to locate a pending order.
            } elseif ( self::$uid ) {
                $pending_order = llms_locate_order_for_user_and_plan( self::$uid, $plan_id );
                if ( $pending_order ) {
                    $order             = llms_get_post( $pending_order );
                    $atts['order_key'] = ( 'llms-pending' === $order->get( 'status' ) ) ? $order->get( 'order_key' ) : '';
                }
            }
 
            $atts = self::setup_plan_and_form_atts( $plan_id, $atts );
 
            /**
             * Filter the number of columns used to render the checkout/enrollment form.
             *
             * @since Unknown.
             * @since 5.0.0 Added `$form_location` parameter.
             *
             * @param int $cols Number of columns. Accepts 1 or 2.
             * @param LLMS_Access_Plan $plan Access plan object.
             * @param string $form_location Form location ID.
             */
            $atts['cols'] = apply_filters( 'llms_checkout_columns', ( $atts['is_free'] || ! $atts['form_fields'] ) ? 1 : $atts['cols'], $atts['plan'], $atts['form_location'] );
 
            self::checkout( $atts );
 
        } else {
 
            self::error( __( 'Invalid access plan.', 'lifterlms' ) );
 
        }
    } elseif ( isset( $wp->query_vars['confirm-payment'] ) ) {
 
        $order_key = llms_filter_input_sanitize_string( INPUT_GET, 'order' );
        $order     = $order_key ? llms_get_order_by_key( $order_key ) : false;
        if ( ! $order ) {
            self::error( __( 'Could not locate an order to confirm.', 'lifterlms' ) );
            self::checkout_wrapper_end();
            return;
        }
 
        $atts = self::setup_plan_and_form_atts( $order->get( 'plan_id' ), $atts );
 
        if ( $order->get( 'coupon_id' ) ) {
            $atts['coupon'] = new LLMS_Coupon( $order->get( 'coupon_id' ) );
        } else {
            $atts['coupon'] = false;
        }
 
        $atts['selected_gateway'] = llms()->payment_gateways()->get_gateway_by_id( $order->get( 'payment_gateway' ) );
 
        self::confirm_payment( $atts );
 
    } else {
 
        self::error( sprintf( __( 'Your cart is currently empty. Click <a href="%s">here</a> to get started.', 'lifterlms' ), llms_get_page_url( 'courses' ) ) );
 
    }
 
    self::checkout_wrapper_end();
 
}


Top ↑

Changelog Changelog

Changelog
Version Description
7.0.1 Fixed issue encountered when trying to confirm payment for a non-existent order.
7.0.0 Fixed unclosed div.llms-checkout-wrapper on empty cart.
5.9.0 Stop using deprecated FILTER_SANITIZE_STRING.
5.0.0 Organize attribute configuration and add new dynamic attributes related to the LLMS_Form post.
3.35.0 Sanitize input data.
3.30.1 Added check via llms_locate_order_for_user_and_plan() to automatically resume an existing pending order for logged in users if one exists.
1.0.0 Introduced.

Top ↑

User Contributed Notes User Contributed Notes

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