【问题标题】:Is there any function in Leandash to mark complete COURSE programmaticallyLeandash 中是否有任何功能可以以编程方式标记完成课程
【发布时间】:2021-09-23 13:25:09
【问题描述】:

我正在做 Leandash 项目,现在我的要求是一些学生已经离线完成了课程,所以我为组长创建了一个屏幕,组长可以在其中选择组/用户/课程,还可以像这样添加日期(https://prnt.sc/1bfcq3a) 并且可以标记完成COURSE

所以我的问题是如何标记完成课程。以编程方式点击链接。

这是我的代码,它不起作用

jQuery(document).on('click', '.course_complete_save', function(event) {
    event.preventDefault();

    var selected_group_id = jQuery('#group_name_select_dropdown').val();
    var selected_user_id = jQuery('#user_name_select_dropdown').val();
    var selected_course_id = jQuery('#course_name_select_dropdown').val();
    var mark_complete_date = jQuery('#input_date_field').val();

    var params =  {"mark_complete_date":mark_complete_date,"selected_group_id":selected_group_id,"selected_user_id":selected_user_id,"selected_course_id":selected_course_id,action:"mark_complete_course_ajax"}

    jQuery.post(groupcustomisation.ajaxurl,params,function(data){
        if(data){
            jQuery(".mark_complete_success").empty().append("Mark Completed");
        }else{
            jQuery(".mark_complete_success").empty().append("No data Found");
        }

    });
});


<?php 
add_action('wp_ajax_nopriv_mark_complete_course_ajax', 'mark_complete_course_ajax');
add_action('wp_ajax_mark_complete_course_ajax', 'mark_complete_course_ajax');
function mark_complete_course_ajax() {

    $selected_group_id = $_POST['selected_group_id'];
    $selected_user_id = $_POST['selected_user_id'];
    $selected_course_id = $_POST['selected_course_id'];
    $mark_complete_date = $_POST['mark_complete_date'];

    learndash_process_mark_complete( $selected_user_id, $selected_course_id, true, $selected_course_id );
        
    echo "1";
         
    die();
}

【问题讨论】:

    标签: wordpress filter hook learndash


    【解决方案1】:

    很有趣,在您昨天发布此内容几分钟后,我发现自己需要解决同样的问题,如您所见,上面的功能无法正常工作,并且在网上没有任何用处。简而言之,我花了一整天的时间试图找出原因,直到我意识到所有课程和测验也需要标记为完成,并且在根据我对 learndash 源代码作为主要来源的研究编写了执行此操作的函数之后,我决定回到这里发布函数,以防万一你还没有修复它

    Usage: sci_learndash_mark_course_complete($course_id, $user_id)
    

    函数如下:

    /**
     * Mark learndash course as complete.
     *
     * @param int $id Course ID.
     * @param int $user_id User ID.
     */
    function sci_learndash_mark_course_complete($id, $user_id)
    {
    
    
        //retreive current course progress
        $user_progress['course'][$id] = learndash_user_get_course_progress($user_id, $id, 'legacy');
    
        if (isset($user_progress['course'][$id]['lessons'])) {
    
            //update lessons progress to complete
            $lesson_array                            = $user_progress['course'][$id]['lessons'];
            $lessons                                 = array_flip($lesson_array);
            $lessons                                 = array_fill_keys(array_keys($lesson_array), 1);
            $user_progress['course'][$id]['lessons'] = $lessons;
    
        }
    
    
        //update topics progress to complete
        if (isset($user_progress['course'][$id]['topics'])) {
            foreach($user_progress['course'][$id]['topics'] as $ldtopic_key => $ldtopic){
                if(count($ldtopic) > 0){
                    $new_ldtopic                                 = array_flip($ldtopic);
                    $new_ldtopic                                 = array_fill_keys(array_keys($ldtopic), 1);
                    $user_progress['course'][$id]['topics'][$ldtopic_key] = $new_ldtopic;
                }
            }
        
        }
    
        //update quiz progress to complete
        if (isset($user_progress['quiz'][$id])) {
            $quiz_array                           = $user_progress['course'][$id]['quiz'];
            $quiz                                 = array_flip($quiz_array);
            $quiz                                 = array_fill_keys(array_keys($quiz_array), 1);
            $user_progress['course'][$id]['quiz'] = $quiz;
        }else{
            $quiz_list = [];
            if ( isset($user_progress['course'][$id]['lessons'])  && count($user_progress['course'][$id]['lessons']) > 0 ) {
                $ld_lesson_keys = array_keys($user_progress['course'][$id]['lessons']);
                foreach($ld_lesson_keys as $course_lesson_id){
                        $topic_quizzes = learndash_get_lesson_quiz_list( $course_lesson_id );
                        if (!empty($topic_quizzes)){
                            foreach ($topic_quizzes as $topic_quiz) {
                                $quiz_list[$topic_quiz['post']->ID] = 1;
                            }
                        }
                }
            }
            if (!empty($quiz_list)){
                $user_progress['quiz'][$id] = $quiz_list;
            }
        }
    
        $processed_course_ids = [];
    
        if ((isset($user_progress['course'])) && (!empty($user_progress['course']))) {
    
            $usermeta        = get_user_meta($user_id, '_sfwd-course_progress', true);
            $course_progress = empty($usermeta) ? [] : $usermeta;
    
            $course_changed = false; // Simple flag to let us know we changed the quiz data so we can save it back to user meta.
    
            foreach ($user_progress['course'] as $course_id => $course_data_new) {
    
                $processed_course_ids[intval($course_id)] = intval($course_id);
    
                if (isset($course_progress[$course_id])) {
                    $course_data_old = $course_progress[$course_id];
                } else {
                    $course_data_old = [];
                }
    
                $course_data_new = learndash_course_item_to_activity_sync($user_id, $course_id, $course_data_new,
                    $course_data_old);
    
                $course_progress[$course_id] = $course_data_new;
    
                $course_changed = true;
            }
    
            if (true === $course_changed) {
                update_user_meta($user_id, '_sfwd-course_progress', $course_progress);
            }
        }
    
        
        if ((isset($user_progress['quiz'])) && (!empty($user_progress['quiz']))) {
    
            $usermeta       = get_user_meta($user_id, '_sfwd-quizzes', true);
            $quizz_progress = empty($usermeta) ? [] : $usermeta;
            $quiz_changed   = false; // Simple flag to let us know we changed the quiz data so we can save it back to user meta.
    
            foreach ($user_progress['quiz'] as $course_id => $course_quiz_set) {
                foreach ($course_quiz_set as $quiz_id => $quiz_new_status) {
                    $quiz_meta = get_post_meta($quiz_id, '_sfwd-quiz', true);
    
                    if (!empty($quiz_meta)) {
                        $quiz_old_status = !learndash_is_quiz_notcomplete($user_id, [$quiz_id => 1], false, $course_id);
    
                        // For Quiz if the admin marks a qiz complete we don't attempt to update an existing attempt for the user quiz.
                        // Instead we add a new entry. LD doesn't care as it will take the complete one for calculations where needed.
                        if ((bool)true === (bool)$quiz_new_status) {
                            if ((bool)true !== (bool)$quiz_old_status) {
    
                                if (isset($quiz_meta['sfwd-quiz_lesson'])) {
                                    $lesson_id = absint($quiz_meta['sfwd-quiz_lesson']);
                                } else {
                                    $lesson_id = 0;
                                }
    
                                if (isset($quiz_meta['sfwd-quiz_topic'])) {
                                    $topic_id = absint($quiz_meta['sfwd-quiz_topic']);
                                } else {
                                    $topic_id = 0;
                                }
    
                                // If the admin is marking the quiz complete AND the quiz is NOT already complete...
                                // Then we add the minimal quiz data to the user profile.
                                $quizdata = [
                                    'quiz'                => $quiz_id,
                                    'score'               => 0,
                                    'count'               => 0,
                                    'question_show_count' => 0,
                                    'pass'                => true,
                                    'rank'                => '-',
                                    'time'                => time(),
                                    'pro_quizid'          => absint($quiz_meta['sfwd-quiz_quiz_pro']),
                                    'course'              => $course_id,
                                    'lesson'              => $lesson_id,
                                    'topic'               => $topic_id,
                                    'points'              => 0,
                                    'total_points'        => 0,
                                    'percentage'          => 0,
                                    'timespent'           => 0,
                                    'has_graded'          => false,
                                    'statistic_ref_id'    => 0,
                                    'm_edit_by'           => get_current_user_id(), // Manual Edit By ID.
                                    'm_edit_time'         => time(), // Manual Edit timestamp.
                                ];
    
                                $quizz_progress[] = $quizdata;
    
                                if (true === $quizdata['pass']) {
                                    $quizdata_pass = true;
                                } else {
                                    $quizdata_pass = false;
                                }
    
                                // Then we add the quiz entry to the activity database.
                                learndash_update_user_activity(
                                    [
                                        'course_id'          => $course_id,
                                        'user_id'            => $user_id,
                                        'post_id'            => $quiz_id,
                                        'activity_type'      => 'quiz',
                                        'activity_action'    => 'insert',
                                        'activity_status'    => $quizdata_pass,
                                        'activity_started'   => $quizdata['time'],
                                        'activity_completed' => $quizdata['time'],
                                        'activity_meta'      => $quizdata,
                                    ]
                                );
    
                                $quiz_changed = true;
    
                                if ((isset($quizdata['course'])) && (!empty($quizdata['course']))) {
                                    $quizdata['course'] = get_post($quizdata['course']);
                                }
    
                                if ((isset($quizdata['lesson'])) && (!empty($quizdata['lesson']))) {
                                    $quizdata['lesson'] = get_post($quizdata['lesson']);
                                }
    
                                if ((isset($quizdata['topic'])) && (!empty($quizdata['topic']))) {
                                    $quizdata['topic'] = get_post($quizdata['topic']);
                                }
    
                                /**
                                 * Fires after the quiz is marked as complete.
                                 *
                                 * @param arrat $quizdata An array of quiz data.
                                 * @param WP_User $user WP_User object.
                                 */
                                do_action('learndash_quiz_completed', $quizdata, get_user_by('ID', $user_id));
    
                            }
                        } elseif (true !== $quiz_new_status) {
                            // If we are unsetting a quiz ( changing from complete to incomplete). We need to do some complicated things...
                            if (true === $quiz_old_status) {
    
                                if (!empty($quizz_progress)) {
                                    foreach ($quizz_progress as $quiz_idx => $quiz_item) {
    
                                        if (($quiz_item['quiz'] == $quiz_id) && (true === $quiz_item['pass'])) {
                                            $quizz_progress[$quiz_idx]['pass'] = false;
    
                                            // We need to update the activity database records for this quiz_id
                                            $activity_query_args = [
                                                'post_ids'      => $quiz_id,
                                                'user_ids'      => $user_id,
                                                'activity_type' => 'quiz',
                                            ];
                                            $quiz_activity       = learndash_reports_get_activity($activity_query_args);
                                            if ((isset($quiz_activity['results'])) && (!empty($quiz_activity['results']))) {
                                                foreach ($quiz_activity['results'] as $result) {
                                                    if ((isset($result->activity_meta['pass'])) && (true === $result->activity_meta['pass'])) {
    
                                                        // If the activity meta 'pass' element is set to true we want to update it to false.
                                                        learndash_update_user_activity_meta($result->activity_id, 'pass',
                                                            false);
    
                                                        // Also we need to update the 'activity_status' for this record
                                                        learndash_update_user_activity(
                                                            [
                                                                'activity_id'     => $result->activity_id,
                                                                'course_id'       => $course_id,
                                                                'user_id'         => $user_id,
                                                                'post_id'         => $quiz_id,
                                                                'activity_type'   => 'quiz',
                                                                'activity_action' => 'update',
                                                                'activity_status' => false,
                                                            ]
                                                        );
                                                    }
                                                }
                                            }
    
                                            $quiz_changed = true;
                                        }
    
                                        /**
                                         * Remove the quiz lock.
                                         *
                                         * @since 2.3.1
                                         */
                                        if ((isset($quiz_item['pro_quizid'])) && (!empty($quiz_item['pro_quizid']))) {
                                            learndash_remove_user_quiz_locks($user_id, $quiz_item['quiz']);
                                        }
                                    }
                                }
                            }
                        }
    
                        $processed_course_ids[intval($course_id)] = intval($course_id);
                    }
                }
            }
    
            if (true === $quiz_changed) {
                update_user_meta($user_id, '_sfwd-quizzes', $quizz_progress);
            }
        }
    
        if (!empty($processed_course_ids)) {
            foreach (array_unique($processed_course_ids) as $course_id) {
                learndash_process_mark_complete($user_id, $course_id);
                learndash_update_group_course_user_progress($course_id, $user_id);
            }
        }
    }
    

    【讨论】:

    • 嗨@olawale-adesina 所以我在这里需要做的是,而不是调用这个函数learndash_process_mark_complete,我需要使用这个函数sci_learndash_mark_course_complete并通过$course_id$user_id对?
    • 嗨@olawale-adesina 我已经使用了这个功能,但它只标记完整的课程(prnt.sc/1bfhljl),甚至不是主题,也不是整个课程
    • 将新功能放在您的子主题或插件中,然后将learndash_process_mark_complete( $selected_user_id, $selected_course_id, true, $selected_course_id ); 替换为sci_learndash_mark_course_complete($course_id, $user_id) 并确保单独传递$course_id 和$user_id @ParthaviPatel
    • 我这样做了,但它只将完整的 LESSON 标记为完整:prnt.sc/1bfhljl
    • ...发送您的应用程序/源代码的屏幕截图
    猜你喜欢
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    相关资源
    最近更新 更多