gocodebox/lifterlms

View on GitHub
includes/certificates/class.llms.certificate.user.php

Summary

Maintainability
A
1 hr
Test Coverage
F
30%
<?php
/**
 * Certificate
 *
 * @package LifterLMS/Classes/Certificates
 *
 * @since 1.0.0
 * @version 6.0.0
 */

defined( 'ABSPATH' ) || exit;

/**
 * Certificate class
 *
 * Generates certificate post for user, triggered from engagement.
 *
 * @since 1.0.0
 * @since 3.30.3 Explicitly define class properties.
 * @deprecated 6.0.0 Class `LLMS_Certificate_User` is deprecated with no direct replacement.
 */
class LLMS_Certificate_User extends LLMS_Certificate {

    /**
     * @var string|false
     * @since 1.0.0
     */
    public $account_link;

    /**
     * @var string
     * @since 1.0.0
     */
    public $email_content;

    /**
     * @var string
     * @since 1.0.0
     */
    public $recipient;

    /**
     * partial path and file name of HTML template
     *
     * @var string
     * @since 1.0.0
     */
    public $template_html;

    /**
     * @var array
     * @since 1.0.0
     */
    public $user = array();

    /**
     * @var WP_User|false
     * @since 1.0.0
     */
    public $user_data;

    /**
     * @var string
     * @since 1.0.0
     */
    public $user_email;

    /**
     * @var string
     * @since 1.0.0
     */
    public $user_firstname;

    /**
     * @var string
     * @since 1.0.0
     */
    public $user_lastname;

    /**
     * @var string
     * @since 1.0.0
     */
    public $user_login;

    /**
     * @var string
     * @since 1.0.0
     */
    public $user_pass;

    /**
     * Alert when deprecated methods are used.
     *
     * This class as well as core classes extending it have been deprecated. All public and protected methods
     * have been changed to private and will be made accessible through this magic method which also emits a
     * deprecation warning.
     *
     * This public method has been intentionally marked as private to denote it's temporary lifespan. It will be
     * removed alongside this class in the next major release.
     *
     * @since 6.0.0
     *
     * @access private
     *
     * @param string $name Name of the method being called.
     * @param array  $args Arguments provided to the method.
     * @return void
     */
    public function __call( $name, $args ) {
        _deprecated_function( __CLASS__ . '::' . esc_html( $name ), '6.0.0' );
        if ( method_exists( $this, $name ) ) {
            $this->$name( ...$args );
        }
    }

    /**
     * Check if the user has already earned this achievement used to prevent duplicates
     *
     * @since 3.4.1
     * @since 3.17.4 Unknown.
     *
     * @return boolean
     */
    private function has_user_earned() {

        global $wpdb;

        $count = (int) $wpdb->get_var(
            $wpdb->prepare(
                "
            SELECT COUNT( pm.meta_id )
            FROM {$wpdb->postmeta} AS pm
            JOIN {$wpdb->prefix}lifterlms_user_postmeta AS upm ON pm.post_id = upm.meta_value
            WHERE pm.meta_key = '_llms_certificate_template'
              AND pm.meta_value = %d
              AND upm.meta_key = '_certificate_earned'
              AND upm.user_id = %d
              AND upm.post_id = %d
              LIMIT 1
            ;",
                array( $this->certificate_template_id, $this->userid, $this->lesson_id )
            )
        );

        /**
         * Deprecated.
         *
         * @since Unknown.
         * @deprecated 6.0.0 Filter `llms_certificate_has_user_earned` is deprecated in favor of `llms_earned_certificate_dupcheck`.
         *
         * @param boolean               $has_earned Whether or not the certificate has been earned.
         * @param LLMS_Certificate_User $user_cert  The user certificate object.
         */
        return apply_filters_deprecated( 'llms_certificate_has_user_earned', array( ( $count >= 1 ), $this ), 'llms_earned_certificate_dupcheck' );
    }

    /**
     * Sets up data needed to generate certificate.
     *
     * @since Unknown
     * @since 3.24.0 Unknown.
     * @deprecated 6.0.0 `LLMS_Certificate_User::init()` is deprecated with no replacement.
     *
     * @param int $email_id  ID of Certificate.
     * @param int $person_id ID of the user receiving the certificate.
     * @param int $lesson_id ID of associated lesson.
     * @return void
     */
    private function init( $email_id, $person_id, $lesson_id ) {

        global $wpdb;

        $email_content = get_post( $email_id );
        $email_meta    = get_post_meta( $email_content->ID );

        $this->certificate_template_id = $email_id;
        $this->lesson_id               = $lesson_id;
        $this->title                   = $email_content->post_title;
        $this->certificate_title       = $email_meta['_llms_certificate_title'][0] ?? $email_content->post_title;
        $this->content                 = $email_content->post_content;
        $this->image                   = $email_meta['_llms_certificate_image'][0] ?? '';
        $this->userid                  = $person_id;
        $this->user                    = get_user_meta( $person_id );
        $this->user_data               = get_userdata( $person_id );
        $this->user_firstname          = ( '' != $this->user['first_name'][0] ? $this->user['first_name'][0] : $this->user['nickname'][0] );
        $this->user_lastname           = ( '' != $this->user['last_name'][0] ? $this->user['last_name'][0] : '' );
        $this->user_email              = $this->user_data->data->user_email;
        $this->template_html           = 'certificates/template.php';
        $this->email_content           = $email_content->post_content;
        $this->account_link            = get_permalink( llms_get_page_id( 'myaccount' ) );

        $this->user_login = $this->user_data->user_login;
    }

    /**
     * Award the cert to a user.
     *
     * @since Unknown
     * @deprecated 6.0.0 `LLMS_Certificate_User::trigger()` is deprecated with no replacement.
     *
     * @param int $user_id   ID of the user receiving the certificate.
     * @param int $email_id  ID of the certificate.
     * @param int $lesson_id ID of the associated lesson.
     *
     * @return void
     */
    private function trigger( $user_id, $email_id, $lesson_id ) {

        $this->init( $email_id, $user_id, $lesson_id );

        // Only award cert if the user hasn't already earned it.
        if ( $this->has_user_earned() ) {
            return;
        }

        if ( $user_id ) {
            $this->object     = new WP_User( $user_id );
            $this->user_email = stripslashes( $this->object->user_email );
            $this->recipient  = $this->user_email;

        }

        if ( ! $this->is_enabled() ) {
            return; }

        $this->create( $this->get_content() );
    }

    /**
     * get_content_html function.
     *
     * @since 1.0.0
     * @since 3.17.4 Unknown.
     * @since 5.0.0 Merge the [llms-user] (and others) shortcode.
     * @deprecated 6.0.0 `LLMS_Certificate_User::get_content_html()` is deprecated with no replacement.
     *
     * @return string
     */
    private function get_content_html() {

        add_filter( 'llms_user_info_shortcode_user_id', array( $this, 'set_shortcode_user' ) );

        $codes = apply_filters(
            'llms_certificate_merge_codes',
            array(
                '{site_title}'    => $this->get_blogname(),
                '{user_login}'    => $this->user_login,
                '{site_url}'      => $this->account_link,
                '{first_name}'    => $this->user_firstname,
                '{last_name}'     => $this->user_lastname,
                '{email_address}' => $this->user_email,
                '{student_id}'    => $this->userid,
                '{current_date}'  => date_i18n( get_option( 'date_format' ), current_time( 'timestamp' ) ),
            ),
            $this
        );

        $this->find    = array_keys( $codes );
        $this->replace = array_values( $codes );

        $content = $this->format_string( $this->content );

        // In certain circumstances shortcodes won't be registered yet.
        LLMS_Shortcodes::init();

        ob_start();
        llms_get_template(
            $this->template_html,
            array(
                'email_message' => do_shortcode( $content ),
                'title'         => $this->title,
                'image'         => $this->image,
            )
        );

        remove_filter( 'llms_user_info_shortcode_user_id', array( $this, 'set_shortcode_user' ) );

        return ob_get_clean();
    }

    /**
     * Set the user ID used by [llms-user] to the user earning the certificate.
     *
     * @since 5.0.0
     * @deprecated 6.0.0 `LLMS_Certificate_User::set_shortcode_user()` is deprecated with no replacement.
     *
     * @param int $uid WP_User ID of the current user.
     * @return int
     */
    private function set_shortcode_user( $uid ) {
        return $this->userid;
    }
}

return new LLMS_Certificate_User();