gocodebox/lifterlms

View on GitHub
includes/class-llms-staging.php

Summary

Maintainability
A
25 mins
Test Coverage
A
100%
<?php
/**
 * Handle warnings and notices when staging is enabled.
 *
 * @package LifterLMS/Classes
 *
 * @since 3.32.0
 * @version 5.9.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * LLMS_Staging class.
 *
 * @since 3.32.0
 */
class LLMS_Staging {

    /**
     * Static Constructor.
     *
     * @since 3.32.0
     * @since 4.12.0 Add hook on `llms_site_clone_detected` action.
     * @since 4.13.0 Only add actions when recurring payments constant is not defined.
     *               If `LLMS_SITE_IS_CLONE` is defined & true, automatically disable recurring payments.
     *
     * @return void
     */
    public static function init() {

        if ( defined( 'LLMS_SITE_IS_CLONE' ) && LLMS_SITE_IS_CLONE ) {
            llms_maybe_define_constant( 'LLMS_SITE_FEATURE_RECURRING_PAYMENTS', false );
        }

        if ( ! defined( 'LLMS_SITE_FEATURE_RECURRING_PAYMENTS' ) ) {
            add_action( 'llms_site_clone_detected', array( __CLASS__, 'clone_detected' ) );
            add_action( 'admin_init', array( __CLASS__, 'handle_staging_notice_actions' ) );
        }

        add_action( 'admin_menu', array( __CLASS__, 'menu_warning' ) );

    }

    /**
     * Callback function to automatically disable site features when a clone is detected
     *
     * @since 4.12.0
     * @since 4.13.0 Only disable payments for logged in users on the admin panel when not processing ajax requests.
     *
     * @return void
     */
    public static function clone_detected() {

        if ( is_admin() && current_user_can( 'manage_lifterlms' ) && ! wp_doing_ajax() ) {
            self::notice();
            LLMS_Site::update_feature( 'recurring_payments', false );
        }

    }

    /**
     * Retrieves the HTML for the "warning bubble" displayed in the admin menu when staging mode is active
     *
     * @since 4.12.0
     *
     * @return string
     */
    protected static function get_menu_warning_bubble() {
        return ' <span class="update-plugins">' . esc_html__( 'Staging', 'lifterlms' ) . '</span>';
    }

    /**
     * Handle the action buttons present in the recurring payments staging notice.
     *
     * @since 3.32.0
     * @since 3.35.0 Sanitize input data.
     * @since 4.12.0 Use `llms_filter_input()` for retrieval of `$_GET` data.
     * @since 5.9.0 Drop usage of deprecated `FILTER_SANITIZE_STRING`.
     *
     * @return void
     */
    public static function handle_staging_notice_actions() {

        if ( ! isset( $_GET['llms-staging-status'] ) || ! isset( $_GET['_llms_staging_nonce'] ) ) {
            return;
        }

        if ( ! llms_verify_nonce( '_llms_staging_nonce', 'llms_staging_status', 'GET' ) || ! current_user_can( 'manage_options' ) ) {
            wp_die( __( 'Action failed. Please refresh the page and retry.', 'lifterlms' ) );
        }

        $action = llms_filter_input( INPUT_GET, 'llms-staging-status' );
        if ( 'enable' === $action ) {
            LLMS_Site::set_lock_url();
            LLMS_Site::update_feature( 'recurring_payments', true );
        } elseif ( 'disable' === $action ) {
            LLMS_Site::clear_lock_url();
            LLMS_Site::update_feature( 'recurring_payments', false );
            update_option( 'llms_site_url_ignore', 'yes' );
        }

        LLMS_Admin_Notices::delete_notice( 'maybe-staging' );

        if ( ! empty( $_SERVER['HTTP_REFERER'] ) ) {
            llms_redirect_and_exit( sanitize_text_field( wp_unslash( $_SERVER['HTTP_REFERER'] ) ) );
        }

    }



    /**
     * Adds a "bubble" to the "Orders" menu item when recurring payments are disabled.
     *
     * @since 3.32.0
     * @since 4.12.0 Moved HTML for the warning bubble into it's own method.
     *
     * @return void
     */
    public static function menu_warning() {

        if ( LLMS_Site::get_feature( 'recurring_payments' ) ) {
            return;
        }

        global $menu;
        foreach ( $menu as $index => $item ) {

            if ( 'edit.php?post_type=llms_order' === $item[2] ) {
                $menu[ $index ][0] .= self::get_menu_warning_bubble();
            }
        }

    }

    /**
     * Output a notice informing the user the site was put into staging mode.
     *
     * @since 4.12.0
     *
     * @return void
     */
    public static function notice() {

        $id = 'maybe-staging';

        if ( ! LLMS_Admin_Notices::has_notice( $id ) ) {

            LLMS_Admin_Notices::add_notice(
                $id,
                array(
                    'type'        => 'info',
                    'dismissible' => false,
                    'remindable'  => false,
                    'template'    => 'admin/notices/staging.php',
                )
            );

        }

    }

}

return LLMS_Staging::init();