我对 learndash 课程自动完成有一些问题,由于某种原因,在所有主题完成后,课程不再被标记为已完成。我试图使用下面的代码来实现这个功能
add_action('learndash_topic_completed', 'custom_check_lesson_completion');
function custom_check_lesson_completion() {
if (!empty($_POST)) {
error_log('POST Data: ' . print_r($_POST, true));
}
// Check if $_POST variable contains topic_id
if (isset($_POST['post'])) {
// Retrieve the topic ID
$topic_id = intval($_POST['post']);
// Get lesson ID associated with the completed topic
$lesson_id = learndash_get_setting($topic_id, 'lesson');
// Check if the lesson is set
if (!empty($lesson_id)) {
// Get all topics associated with the lesson
$lesson_topics = learndash_get_topic_list($lesson_id);
// Check if all topics in the lesson are completed
$all_completed = true;
foreach ($lesson_topics as $lesson_topic) {
if (!learndash_is_topic_complete(get_current_user_id(), $lesson_topic)) {
$all_completed = false;
break;
}
}
// If all topics are completed, mark the lesson as completed
if ($all_completed) {
$this_lesson = get_post($lesson_id);
// learndash_update_completion(get_current_user_id(), $lesson_id);
learndash_mark_complete_process($this_lesson);
}
}
}
}
我已经尝试了上述代码的多种变体,实现了本网站的不同功能https://developers.learndash.com/
但是他们似乎都没有设置课程进度来完成我也尝试过使用下面的代码来规避这个问题,该代码只是检查课程进度并在超过一定百分比时更改它
add_action( 'learndash_user_course_progress_updated', 'custom_mark_course_completed', 10, 5 );
function custom_mark_course_completed( $user_id, $course_id, $course_progress, $course_info, $ld_course ) {
// Check if course progress is above 96%
if ( $course_progress > 96 ) {
// Set course progress to 100%
learndash_update_user_course_progress( $user_id, $course_id, 100 );
// Mark course as completed
learndash_mark_course_completed( $user_id, $course_id );
}
}```
i believe my fault is possibly outdated learndash functions however i cant seem to find any info on that i would appreciate any help thanks
问题已确认
我遇到了完全相同的问题:完成所有 LearnDash 主题有时不会导致相关课程被标记为完成。
我说“有时”是指干净的测试课程,测试用户的 LearnDash 数据已被清除:
解决方案(对我有用!)
使用您的(太棒了!)代码作为基础,只需进行一些调整,我相信我已经让它工作了,两次完整的测试运行始终显示课程在其主题完成时自动标记为完成。
两个调整
调整 1 - 检查所有主题是否完整的代码:
$all_completed = true;
foreach ($lesson_topics as $lesson_topic) {
if (!learndash_is_topic_complete(get_current_user_id(), $lesson_topic)) {
$all_completed = false;
break;
}
}
第3行,我将
$lesson_topic
更改为$lesson_topic->ID
,因为$lesson_topic
是一个WP_Post对象,但该函数需要一个Int post ID,否则我会遇到错误。
调整 2 - 如果所有主题都已完成,则将相关课程标记为完成的代码:
//If all topics are completed, mark the lesson as completed
if ($all_completed) {
$this_lesson = get_post($lesson_id);
learndash_mark_complete_process($this_lesson);
}
第四行,我必须将
learndash_mark_complete_process($this_lesson);
更改为 learndash_mark_complete_process(get_current_user_id(), $this_lesson, true);
正如我所说,我只通过两次测试来运行它,但它似乎满足了要求。非常感谢您的代码,顺便说一句,它节省了我很多工作。希望这对你有用!