LLMS_Shortcodes
Contents
Source Source
File: includes/shortcodes/class.llms.shortcodes.php
class LLMS_Shortcodes { /** * Constructor. * * @since 6.4.0 * * @return void */ public function __construct() { add_action( 'init', array( 'LLMS_Shortcodes', 'init' ) ); } /** * Initialize shortcodes array. * * @since 1.0.0 * @since 3.11.1 Unknown. * @since 4.0.0 Stop registering previously deprecated shortcode `[courses]` and `[lifterlms_user_statistics]`. * @since 6.0.0 Removed loading of class files that don't instantiate their class in favor of autoloading. * @since 6.4.0 Allowed `LLMS_Shortcode_User_Info` class to be filtered. * @since 7.5.0 Added `LLMS_Shortcode_Favorites` class in shortcodes array. * * @return void */ public static function init() { // New method. $scs = apply_filters( /** * Filters the shortcodes to initialize. * * @since Unknown * * @param string[] $shortcodes Array of shortcode class names to initialize. */ 'llms_load_shortcodes', array( 'LLMS_Shortcode_Course_Author', 'LLMS_Shortcode_Course_Continue', 'LLMS_Shortcode_Course_Continue_Button', 'LLMS_Shortcode_Course_Meta_Info', 'LLMS_Shortcode_Course_Outline', 'LLMS_Shortcode_Course_Prerequisites', 'LLMS_Shortcode_Course_Reviews', 'LLMS_Shortcode_Course_Syllabus', 'LLMS_Shortcode_Courses', 'LLMS_Shortcode_Hide_Content', 'LLMS_Shortcode_Lesson_Mark_Complete', 'LLMS_Shortcode_Membership_Link', 'LLMS_Shortcode_My_Achievements', 'LLMS_Shortcode_Registration', 'LLMS_Shortcode_User_Info', 'LLMS_Shortcode_Favorites', ) ); $hyphenated_file_classes = array( 'LLMS_Shortcode_User_Info', ); foreach ( $scs as $class ) { $separator = in_array( $class, $hyphenated_file_classes, true ) ? '-' : '.'; $filename = "class{$separator}" . strtolower( str_replace( '_', $separator, $class ) ); /** * Filters the path of the shortcode class file. * * @since Unknown * * @param string $file The shortcode class file name. * @param string $class The shortcode class name. */ $path = apply_filters( 'llms_load_shortcode_path', LLMS_PLUGIN_DIR . "includes/shortcodes/{$filename}.php", $class ); if ( file_exists( $path ) ) { require_once $path; } } /** * @deprecated 2.0.0 * @todo deprecate */ add_shortcode( 'courses', array( LLMS_Shortcode_Courses::instance(), 'output' ) ); // Old method. $shortcodes = array( 'lifterlms_access_plan_button' => __CLASS__ . '::access_plan_button', 'lifterlms_my_account' => __CLASS__ . '::my_account', 'lifterlms_checkout' => __CLASS__ . '::checkout', 'lifterlms_course_info' => __CLASS__ . '::course_info', 'lifterlms_course_progress' => __CLASS__ . '::course_progress', 'lifterlms_course_title' => __CLASS__ . '::course_title', 'lifterlms_related_courses' => __CLASS__ . '::related_courses', 'lifterlms_login' => __CLASS__ . '::login', 'lifterlms_pricing_table' => __CLASS__ . '::pricing_table', 'lifterlms_memberships' => __CLASS__ . '::memberships', ); foreach ( $shortcodes as $shortcode => $function ) { add_shortcode( /** * Filters the shortcode tag. * * The dynamic portion of the hook name, `$shortcode` refers to the shortcode tag itself. * * @since Unknown * * @param string $shortcode The shortcode tag. */ apply_filters( "{$shortcode}_shortcode_tag", $shortcode ), $function ); } } /** * Allows shortcodes to enqueue a script by handle * * Ensures the handle is registered and that it hasn't already been enqueued. * * @since 3.0.2 * * @param string $handle Script handle used to register the script. * The script should be registered in `LLMS_Frontend_Assets`. * @return void */ private static function enqueue_script( $handle ) { if ( wp_script_is( $handle, 'registered' ) && ! wp_script_is( $handle, 'enqueued' ) ) { wp_enqueue_script( $handle ); } } /** * Retrieve the course ID from within a course, lesson, or quiz * * @since 2.7.9 * @since 3.16.0 Unknown. * @since 4.0.0 Remove reliance on deprecated class `LLMS_Quiz_Legacy`. * * @return int */ private static function get_course_id() { $id = get_the_ID(); if ( is_course() ) { return $id; } $course = llms_get_post_parent_course( $id ); if ( $course ) { return $course->get( 'id' ); } return 0; } /** * Creates a wrapper for shortcode. * * @return string */ public static function shortcode_wrapper( $function, $atts = array(), $wrapper = array( 'class' => 'lifterlms', 'before' => null, 'after' => null, ) ) { ob_start(); $before = empty( $wrapper['before'] ) ? '<div class="' . esc_attr( $wrapper['class'] ) . '">' : $wrapper['before']; $after = empty( $wrapper['after'] ) ? '</div>' : $wrapper['after']; echo $before; call_user_func( $function, $atts ); echo $after; return ob_get_clean(); } /** * Create a button for an Access Plan * * @since 3.2.5 * @since 3.4.1 Unknown. * * @param array $atts Associative array of shortcode attributes. * @param string $content Optional. Shortcode content, enables custom text/html in the button. Default empty string. * @return string */ public static function access_plan_button( $atts, $content = '' ) { $atts = shortcode_atts( array( 'classes' => '', 'id' => null, 'size' => '', // Can be: small, large. 'type' => 'primary', // Can be: primary, secondary, action, danger. ), $atts, 'lifterlms_access_plan_button' ); $ret = ''; if ( ! empty( $atts['id'] ) && is_numeric( $atts['id'] ) ) { $plan = new LLMS_Access_Plan( $atts['id'] ); $classes = 'llms-button-' . $atts['type']; $classes .= ! empty( $atts['size'] ) ? ' ' . $atts['size'] : ''; $classes .= ! empty( $atts['classes'] ) ? ' ' . $atts['classes'] : ''; $text = empty( $content ) ? $plan->get_enroll_text() : $content; $ret = '<a class="' . esc_attr( $classes ) . '" href="' . esc_url( $plan->get_checkout_url() ) . '" title="' . esc_attr( $plan->get( 'title' ) ) . '">' . $text . '</a>'; } /** * Filters the access plan button shortcode output * * @since unknown * * @param string $ret The shortcode output. * @param array $atts Associative array of shortcode attributes. * @param string $content Shortcode content, enables custom text/html in the button. Default empty string. */ return apply_filters( 'llms_shortcode_access_plan_button', $ret, $atts, $content ); } /** * Add a login form * * @since 3.0.4 * @since 3.19.4 Unknown. * * @param array $atts Associative array of shortcode attributes. * @return string */ public static function login( $atts ) { extract( shortcode_atts( array( 'layout' => 'columns', 'redirect' => get_permalink(), ), $atts, 'lifterlms_login' ) ); ob_start(); llms_print_notices(); llms_get_login_form( null, $redirect, $layout ); return ob_get_clean(); } /** * My account shortcode * * Used for displaying account. * * @see self::shortcode_wrapper() * * @return string */ public static function my_account( $atts ) { return self::shortcode_wrapper( array( 'LLMS_Shortcode_My_Account', 'output' ), $atts ); } /** * Memberships Shortcode * * Used for shortcode [lifterlms_memberships]. * * @since 1.4.4 * @since 3.0.2 * @since 4.12.0 Handle pagination when the shortcode is used on the static front page. * * @param array $atts Associative array of shortcode attributes. * @return string */ public static function memberships( $atts ) { // Enqueue match height so the loop isn't all messed up visually. self::enqueue_script( 'llms-jquery-matchheight' ); if ( isset( $atts['category'] ) ) { $tax = array( array( 'taxonomy' => 'membership_cat', 'field' => 'slug', 'terms' => $atts['category'], ), ); } $args = array( 'paged' => is_front_page() ? get_query_var( 'page' ) : get_query_var( 'paged' ), 'post_type' => 'llms_membership', 'post_status' => 'publish', 'posts_per_page' => isset( $atts['posts_per_page'] ) ? $atts['posts_per_page'] : -1, 'order' => isset( $atts['order'] ) ? $atts['order'] : 'ASC', 'orderby' => isset( $atts['orderby'] ) ? $atts['orderby'] : 'title', 'tax_query' => isset( $tax ) ? $tax : '', ); if ( isset( $atts['id'] ) ) { $args['p'] = $atts['id']; } $query = new WP_Query( $args ); ob_start(); if ( $query->have_posts() ) : /** * lifterlms_before_loop hook * * @hooked lifterlms_loop_start - 10 */ do_action( 'lifterlms_before_loop' ); while ( $query->have_posts() ) : $query->the_post(); llms_get_template_part( 'loop/content', get_post_type() ); endwhile; /** * lifterlms_before_loop hook * * @hooked lifterlms_loop_end - 10 */ do_action( 'lifterlms_after_loop' ); echo '<nav class="llms-pagination">'; echo paginate_links( array( 'base' => str_replace( 999999, '%#%', esc_url( get_pagenum_link( 999999 ) ) ), 'format' => '?page=%#%', 'total' => $query->max_num_pages, 'current' => max( 1, $args['paged'] ), 'prev_next' => true, 'prev_text' => '«' . __( 'Previous', 'lifterlms' ), 'next_text' => __( 'Next', 'lifterlms' ) . '»', 'type' => 'list', ) ); echo '</nav>'; else : llms_get_template( 'loop/none-found.php' ); endif; wp_reset_postdata(); return ob_get_clean(); } /** * Checkout shortcode * * Used for displaying checkout form. * * @see self::shortcode_wrapper * * @param array $atts Associative array of shortcode attributes. * @return string */ public static function checkout( $atts ) { return self::shortcode_wrapper( array( 'LLMS_Shortcode_Checkout', 'output' ), $atts ); } /** * Output various pieces of metadata about a course * * @since 3.0.0 * @since 3.4.1 Unknown. * * @param array $atts Array of user-submitted shortcode attributes. * @return string */ public static function course_info( $atts ) { extract( shortcode_atts( array( 'date_format' => 'F j, Y', // If $type is date, a custom date format can be supplied. 'id' => get_the_ID(), 'key' => '', 'type' => '', // Can either be: date, price or empty string. ), $atts, 'lifterlms_course_info' ) ); $ret = ''; if ( $key ) { $course = new LLMS_Course( $id ); switch ( $type ) { case 'date': $ret = $course->get_date( $key, $date_format ); break; case 'price': $ret = $course->get_price( $key ); break; default: $ret = $course->get( $key ); } } /** * Filters the course info shortcode output * * @since unknown * * @param string $ret The shortcode output. * @param array $atts Associative array of shortcode attributes. */ return apply_filters( 'llms_shortcode_course_info', $ret, $atts ); } /** * Course Progress Bar Shortcode * * @since unknown * @since 3.38.0 Added logic to display the bar only to enrolled user. * * @param array $atts Associative array of shortcode attributes. * @return string */ public static function course_progress( $atts ) { $course_id = self::get_course_id(); if ( ! $course_id ) { return ''; } if ( ! empty( $atts['check_enrollment'] ) && ! llms_is_user_enrolled( get_current_user_id(), $course_id ) ) { return ''; } $course = new LLMS_Course( $course_id ); $course_progress = $course->get_percent_complete(); return lifterlms_course_progress_bar( $course_progress, false, false, false ); } /** * Retrieve the Course Title * * @since unknown * @since 2.7.9 Unknown * * @param array $atts Associative array of shortcode attributes. * @return string */ public static function course_title( $atts ) { $course_id = self::get_course_id(); if ( ! $course_id ) { return ''; } return get_the_title( $course_id ); } /** * Courses shortcode * * Used for [lifterlms_related_courses]. * * @since unknown * * @param array $atts Associative array of shortcode attributes. * @return array */ public static function related_courses( $atts ) { ob_start(); if ( isset( $atts['category'] ) ) { $tax = array( array( 'taxonomy' => 'course_cat', 'field' => 'slug', 'terms' => $atts['category'], ), ); } $query = new WP_Query( array( 'post_type' => 'course', 'post_status' => 'publish', 'posts_per_page' => isset( $atts['per_page'] ) ? $atts['per_page'] : -1, 'order' => isset( $atts['order'] ) ? $atts['order'] : 'ASC', 'orderby' => isset( $atts['orderby'] ) ? $atts['orderby'] : 'title', 'tax_query' => isset( $tax ) ? $tax : '', ) ); if ( $query->have_posts() ) { lifterlms_course_loop_start(); while ( $query->have_posts() ) : $query->the_post(); llms_get_template_part( 'content', 'course' ); endwhile; lifterlms_course_loop_end(); $courses = ob_get_clean(); wp_reset_postdata(); return $courses; } } /** * Output a Pricing Table anywhere a shortcode can be output * * @since 3.2.5 * @since 3.23.0 Unknown. * @since 3.38.0 Use `in_array()` with strict comparison. * * @param array $atts Associative array of shortcode attributes. * @return string */ public static function pricing_table( $atts ) { $atts = shortcode_atts( array( 'product' => null, ), $atts, 'lifterlms_pricing_table' ); $ret = ''; // get product id from loop if used from within a course or membership. if ( ! $atts['product'] ) { $id = get_the_ID(); if ( in_array( get_post_type( $id ), array( 'course', 'llms_membership' ), true ) ) { $atts['product'] = get_the_ID(); } } if ( ! empty( $atts['product'] ) && is_numeric( $atts['product'] ) ) { // enqueue match height for height alignments. self::enqueue_script( 'llms-jquery-matchheight' ); ob_start(); lifterlms_template_pricing_table( $atts['product'] ); $ret = ob_get_clean(); } /** * Filters the pricing table shortcode output * * @since unknown * * @param string $ret The shortcode output. * @param array $atts Associative array of shortcode attributes. */ return apply_filters( 'llms_shortcode_pricing_table', $ret, $atts ); }
Expand full source code Collapse full source code View on GitHub
Methods Methods
- __construct — Constructor.
- access_plan_button — Create a button for an Access Plan
- checkout — Checkout shortcode
- course_info — Output various pieces of metadata about a course
- course_progress — Course Progress Bar Shortcode
- course_title — Retrieve the Course Title
- enqueue_script — Allows shortcodes to enqueue a script by handle
- get_course_id — Retrieve the course ID from within a course, lesson, or quiz
- init — Initialize shortcodes array.
- login — Add a login form
- memberships — Memberships Shortcode
- my_account — My account shortcode
- pricing_table — Output a Pricing Table anywhere a shortcode can be output
- related_courses — Courses shortcode
- shortcode_wrapper — Creates a wrapper for shortcode.
- user_statistics — Output user statistics related to courses enrolled, completed, etc.
Changelog Changelog
Version | Description |
---|---|
4.0.0 | Remove reliance on deprecated class LLMS_Quiz_Legacy & stop registering deprecated shortcode [courses] and [lifterlms_user_statistics] . |
1.0.0 | Introduced. |