gocodebox/lifterlms

View on GitHub
includes/traits/llms-trait-student-awards.php

Summary

Maintainability
C
1 day
Test Coverage
A
100%
<?php
/**
 * LifterLMS singleton trait.
 *
 * @package LifterLMS/Traits
 *
 * @since 6.0.0
 * @version 6.0.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Retrieve data related to awards earned by a student.
 *
 * This trait should only be used by classes that extend from the {@see LLMS_Abstract_User_Data} class.
 *
 * @since 6.0.0
 */
trait LLMS_Trait_Student_Awards {

    /**
     * Retrieve achievements that a user has earned.
     *
     * @since 2.4.0
     * @since 3.14.0 Unknown.
     * @since 6.0.0 Moved from `LLMS_Student` class.
     *              Introduced alternate usage via `LLMS_Awards_Query` and deprecated previous behavior.
     *
     * @param string|array $args_or_orderby An array of arguments to pass to LLMS_Awards_Query. The deprecated method
     *                                      signature accepts a string representing the field to order the returned results by.
     * @param string       $order           Deprecated signature only: Ordering method for returned results (ASC or DESC).
     * @param string       $return          Deprecated signature only: Return type. Accepts "obj" for an array of objects from
     *                                      $wpdb->get_results and "certificates" for an array of LLMS_User_Certificate instances.
     * @return LLMS_Awards_Query|object[]|LLMS_User_Achievement[]
     */
    public function get_achievements( $args_or_orderby = 'updated_date', $order = 'DESC', $return = 'obj' ) {

        // New behavior.
        if ( is_array( $args_or_orderby ) ) {
            return $this->get_awards( $args_or_orderby, 'achievement' );
        }

        _deprecated_function( 'LLMS_Student::get_achievements()', '6.0.0', 'The behavior of this method has changed. Please refer to https://developer.lifterlms.com/reference/classes/llms_student/get_achievements/ for more information.' );

        $orderby = esc_sql( $args_or_orderby );
        $order   = esc_sql( $order );

        global $wpdb;

        // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared
        $query = $wpdb->get_results(
            $wpdb->prepare(
                "SELECT post_id, meta_value AS achievement_id, updated_date AS earned_date FROM {$wpdb->prefix}lifterlms_user_postmeta WHERE user_id = %d and meta_key = '_achievement_earned' ORDER BY $orderby $order",
                $this->get_id()
            )
        );// db call ok; no-cache ok.
        // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared

        if ( 'achievements' === $return ) {
            $ret = array();
            foreach ( $query as $obj ) {
                $ret[] = new LLMS_User_Achievement( $obj->achievement_id );
            }
            return $ret;
        }

        return $query;

    }

    /**
     * Query student awards.
     *
     * @since 6.0.0
     *
     * @param array  $args Query arguments to pass into `LLMS_Awards_Query`.
     * @param string $type Award type. Accepts "any", "achievement", or "certificate".
     * @return LLMS_Awards_Query
     */
    public function get_awards( $args = array(), $type = 'any' ) {

        $args['type']  = $type;
        $args['users'] = $this->get_id();

        // Prevent potential funny business.
        unset( $args['users__exclude'] );

        return new LLMS_Awards_Query( $args );
    }

    /**
     * Retrieve the total number of awards earned by the student.
     *
     * @since 6.0.0
     *
     * @param string $type Award type. Accepts "any", "achievement", or "certificate".
     * @return int
     */
    public function get_awards_count( $type = 'any' ) {

        $query = $this->get_awards(
            array(
                'per_page' => 1,
                'fields'   => 'ids',
            ),
            $type
        );
        return $query->get_found_results();

    }

    /**
     * Retrieve certificates that the student has been awarded.
     *
     * The default behavior of this method is deprecated since version 6.0.0. The previous behavior
     * is retained for backwards compatibility but will be removed in the next major release.
     *
     * @since 2.4.0
     * @since 3.14.1 Unknown.
     * @since 6.0.0 Moved from `LLMS_Student` class.
     *              Introduced alternate usage via `LLMS_Awards_Query` and deprecated previous behavior.
     *
     * @param string|array $args_or_orderby An array of arguments to pass to LLMS_Awards_Query. The deprecated method
     *                                      signature accepts a string representing the field to order the returned results by.
     * @param string       $order           Deprecated signature only: Ordering method for returned results (ASC or DESC).
     * @param string       $return          Deprecated signature only: Return type. Accepts "obj" for an array of objects from
     *                                      $wpdb->get_results and "certificates" for an array of LLMS_User_Certificate instances.
     * @return LLMS_Awards_Query|object[]|LLMS_User_Certificate[]
     */
    public function get_certificates( $args_or_orderby = 'updated_date', $order = 'DESC', $return = 'obj' ) {

        // New behavior.
        if ( is_array( $args_or_orderby ) ) {
            return $this->get_awards( $args_or_orderby, 'certificate' );
        }

        _deprecated_function( 'LLMS_Student::get_certificates()', '6.0.0', 'The behavior of this method has changed. Please refer to https://developer.lifterlms.com/reference/classes/llms_student/get_certificates/ for more information.' );

        $orderby = esc_sql( $args_or_orderby );
        $order   = esc_sql( $order );

        global $wpdb;

        // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared
        $query = $wpdb->get_results(
            $wpdb->prepare(
                "SELECT post_id, meta_value AS certificate_id, updated_date AS earned_date FROM {$wpdb->prefix}lifterlms_user_postmeta WHERE user_id = %d and meta_key = '_certificate_earned' ORDER BY $orderby $order",
                $this->get_id()
            )
        ); // db call ok; no-cache ok.
        // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared

        if ( 'certificates' === $return ) {
            $ret = array();
            foreach ( $query as $obj ) {
                $ret[] = new LLMS_User_Certificate( $obj->certificate_id );
            }
            return $ret;
        }

        return $query;

    }

}