gocodebox/lifterlms

View on GitHub
includes/admin/llms.functions.admin.php

Summary

Maintainability
C
7 hrs
Test Coverage
B
83%
<?php
/**
 * Core functions used exclusively on the admin panel
 *
 * @package LifterLMS/Admin/Functions
 *
 * @since 3.0.0
 * @version 7.3.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Create a Page & save it's id as an option.
 *
 * @since 3.0.0
 * @since 3.7.5 Unknown.
 * @since 7.3.0 Strip all tags from the page title, slash the page data prior to inserting the page in the db via `wp_insert_post`.
 *              Prefer strict type comparison when using `in_array()`.
 *
 * @param string $slug    Page slug.
 * @param string $title   Page title.
 * @param string $content Page content
 * @param string $option  Option name.
 * @return int Page id.
 */
function llms_create_page( $slug, $title = '', $content = '', $option = '' ) {

    $option_val = get_option( $option );

    // See if there's a valid page already stored for the option we're trying to create.
    if ( $option_val && is_numeric( $option_val ) ) {
        $page_object = get_post( $option_val );
        if ( $page_object && 'page' === $page_object->post_type &&
                ! in_array( $page_object->post_status, array( 'pending', 'trash', 'future', 'auto-draft' ), true ) ) {
            return $page_object->ID;
        }
    }

    global $wpdb;

    // Search for an existing page with the specified page content like a shortcode.
    if ( strlen( $content ) > 0 ) {
        $page_id = $wpdb->get_var(
            $wpdb->prepare(
                "SELECT ID FROM $wpdb->posts WHERE post_type='page' AND post_status NOT IN ( 'pending', 'trash', 'future', 'auto-draft' ) AND post_content LIKE %s LIMIT 1;",
                "%{$content}%"
            )
        );// no-cache ok.
    } else {
        $page_id = $wpdb->get_var(
            $wpdb->prepare(
                "SELECT ID FROM $wpdb->posts WHERE post_type='page' AND post_status NOT IN ( 'pending', 'trash', 'future', 'auto-draft' )  AND post_name = %s LIMIT 1;",
                $slug
            )
        );// no-cache ok.
    }

    /**
     * Filters the ID of the page to be created.
     *
     * @since 3.0.0
     *
     * @param int     $page_id The WP_Post ID of the page.
     * @param string  $slug    The page slug.
     * @param string  $content THe content of the page.
     */
    $page_id = apply_filters( 'llms_create_page_id', $page_id, $slug, $content );
    if ( $page_id ) {
        if ( $option ) {
            update_option( $option, $page_id );
        }
        return $page_id;
    }

    // Look in the trashed page by content.
    if ( strlen( $content ) > 0 ) {
        $trashed_id = $wpdb->get_var(
            $wpdb->prepare(
                "SELECT ID FROM $wpdb->posts WHERE post_type='page' AND post_status = 'trash' AND post_content LIKE %s LIMIT 1;",
                "%{$content}%"
            )
        );// no-cache ok.
    } else {
        $trashed_id = $wpdb->get_var(
            $wpdb->prepare(
                "SELECT ID FROM $wpdb->posts WHERE post_type='page' AND post_status = 'trash' AND post_name = %s LIMIT 1;",
                $slug
            )
        );// no-cache ok.
    }

    // If we find it in the trash move it out of the trash.
    if ( $trashed_id ) {
        $page_id   = $trashed_id;
        $page_data = array(
            'ID'          => $page_id,
            'post_status' => 'publish',
        );
        wp_update_post( $page_data );
    } else {
        $page_data = array(
            'post_status'    => 'publish',
            'post_type'      => 'page',
            'post_author'    => get_current_user_id() ? get_current_user_id() : 1,
            'post_name'      => $slug,
            'post_title'     => wp_strip_all_tags( $title ),
            'post_content'   => $content,
            'comment_status' => 'closed',
        );
        $page_id   = wp_insert_post(
            wp_slash(
                /**
                 * Filters the page data passed to create a page.
                 *
                 * The output of this filter will be slashed via `wp_slash` prior
                 * to being passed to `wp_insert_post` to prevent slashes from
                 * being stripped from the page title.
                 *
                 * @since 3.0.0
                 *
                 * @param array $page_data Array of page data.
                 */
                apply_filters( 'llms_create_page', $page_data )
            )
        );
    }
    if ( $option ) {
        update_option( $option, $page_id );
    }

    return $page_id;

}

/**
 * Retrieve available products from the LifterLMS.com API
 *
 * @since 3.22.0
 *
 * @return array {
 *     Array of LifterLMS add-on data from the LifterLMS.com products api.
 *
 *     @type array   $categories Associative array of add-on category information, mapping ID to Title.
 *     @type array[] $items      List of add-ons definition arrays.
 * }
 */
function llms_get_add_ons( $use_cache = true ) {

    $data = $use_cache ? get_transient( 'llms_products_api_result' ) : false;

    if ( false === $data ) {

        $req  = new LLMS_Dot_Com_API( '/products', array(), 'GET' );
        $data = $req->get_result();

        if ( $req->is_error() ) {
            return $data;
        }

        set_transient( 'llms_products_api_result', $data, DAY_IN_SECONDS );

    }

    return $data;

}

/**
 * Instantiate a new LLMS_Add_On object
 *
 * @since 3.22.0
 *
 * @param string|array $addon      Add-on data array or a string (such as an ID or update file path) used to lookup the addon.
 * @param string       $lookup_key If $addon is a string, this determines how to lookup the addon from the available list of addons.
 * @return LLMS_Add_On|LLMS_Helper_Add_On
 */
function llms_get_add_on( $addon = array(), $lookup_key = 'id' ) {
    if ( class_exists( 'LLMS_Helper_Add_On' ) ) {
        return new LLMS_Helper_Add_On( $addon, $lookup_key );
    }
    return new LLMS_Add_On( $addon, $lookup_key );
}

/**
 * Retrieves HTML for a Dashicon wrapped in an anchor.
 *
 * A utility for adding links to external documentation.
 *
 * @since 7.0.0
 *
 * @param string $url The URL of the anchor tag.
 * @param array  $args {
 *     An array of optional configuration options.
 *
 *     @type integer $size  The size of the icon. Default 18.
 *     @type string  $title The title attribute of the anchor tag. Default: "More information".
 *     @type string  $icon  The Dashicon icon to use, {@see @link https://developer.wordpress.org/resource/dashicons/}. Default: "external".
 * }
 * @return string
 */
function llms_get_dashicon_link( $url, $args = array() ) {

    $args = wp_parse_args(
        $args,
        array(
            'size'  => 18,
            'title' => esc_attr__( 'More information', 'lifterlms' ),
            'icon'  => 'external',
        )
    );

    $dashicon = sprintf(
        '<span class="dashicons dashicons-%1$s" style="font-size:%2$dpx;width:%2$dpx;height:%2$dpx"></span>',
        esc_attr( $args['icon'] ),
        $args['size']
    );

    return sprintf(
        '<a href="%1$s" style="text-decoration:none;" target="_blank" rel="noreferrer" title="%2$s">%3$s</a>',
        esc_url( $url ),
        esc_attr( $args['title'] ),
        $dashicon
    );

}

/**
 * Get an array of available course/membership sales page options
 *
 * @return   array
 * @since    3.23.0
 * @version  3.23.0
 */
function llms_get_sales_page_types() {
    return apply_filters(
        'llms_sales_page_types',
        array(
            'none'    => __( 'Display default course content', 'lifterlms' ),
            'content' => __( 'Show custom content', 'lifterlms' ),
            'page'    => __( 'Redirect to WordPress Page', 'lifterlms' ),
            'url'     => __( 'Redirect to custom URL', 'lifterlms' ),
        )
    );
}

/**
 * Get an array of available course/membership checkout redirection options
 *
 * @since    3.30.0
 * @version  3.30.0
 *
 * @param    string $product_type The product type, Course or Membership
 * @return   array
 */
function llms_get_checkout_redirection_types( $product_type = '' ) {

    $product_type = empty( $product_type ) ? __( 'Course/Membership', 'lifterlms' ) : $product_type;

    return apply_filters(
        'llms_checkout_redirection_types',
        array(
            'self' => sprintf( __( '(Default) Return to %s', 'lifterlms' ), $product_type ),
            'page' => __( 'Redirect to a WordPress Page', 'lifterlms' ),
            'url'  => __( 'Redirect to a custom URL', 'lifterlms' ),
        )
    );
}

/**
 * Add a "merge code" button that to auto-add merge codes to email & etc...
 *
 * @since 3.1.0
 * @since 3.17.4 Unknown.
 * @since 6.0.0 Move HTML into view file: `includes/admin/views/merge-code-editor-button.php`.
 *                Move certificate merge code list to `llms_get_certificate_merge_codes()`.
 *
 * @param string  $target Target to add the merge code to. Accepts the ID of a tinymce editor or a DOM ID (#element-id).
 * @param boolean $echo   If `true`, echos the HTML output.
 * @param array   $codes  Optional array of custom codes to pass in, otherwise the codes are determined
 *                        what is available for the post type.
 * @return string Returns the HTML for the merge code button.
 */
function llms_merge_code_button( $target = 'content', $echo = true, $codes = array() ) {

    $screen = get_current_screen();

    if ( ! $codes && $screen && isset( $screen->post_type ) ) {

        switch ( $screen->post_type ) {

            case 'llms_certificate':
                $codes = llms_get_certificate_merge_codes();
                break;

            case 'llms_email':
                $codes = array(
                    '{site_title}'    => __( 'Website Title', 'lifterlms' ),
                    '{site_url}'      => __( 'Website URL', 'lifterlms' ),
                    '{email_address}' => __( 'Student Email Address', 'lifterlms' ),
                    '{user_login}'    => __( 'Student Username', 'lifterlms' ),
                    '{first_name}'    => __( 'Student First Name', 'lifterlms' ),
                    '{last_name}'     => __( 'Student Last Name', 'lifterlms' ),
                    '{current_date}'  => __( 'Current Date', 'lifterlms' ),
                );
                break;

            default:
                $codes = array();

        }
    }

    /**
     * Filters the list of available merge codes in the specified context.
     *
     * @since Unknown
     *
     * @param array[]        $codes  Associative array of merge codes where the array key is the merge code and the array value is a name / description of the merge code.
     * @param WP_Screen|null $screen The screen object from `get_current_screen().
     * @param string         $target Target to add the merge code to. Accepts the ID of a tinymce editor or a DOM ID (#element-id).
     */
    $codes = apply_filters( 'llms_merge_codes_for_button', $codes, $screen, $target );

    $html = '';
    if ( $codes ) {
        ob_start();
        include LLMS_PLUGIN_DIR . 'includes/admin/views/merge-code-button.php';
        $html = ob_get_clean();
    }

    if ( $echo ) {
        echo $html;
    }

    return $html;

}

/**
 * Retrieve the precision for round function for floating values.
 *
 * @since 7.1.3
 *
 * @return int
 */
function llms_get_floats_rounding_precision() {

    // Used `static` to store precision value so `apply_filters()` run only once per request.
    static $precision = null;

    if ( is_null( $precision ) ) {
        /**
         * Filters the precision for round function for floating values.
         *
         * @since 7.1.3
         *
         * @param int $precision Precision for round function for floating values.
         */
        $precision = apply_filters( 'lifterlms_floats_rounding_precision', 2 );
    }

    return $precision;

}