llms_update_3160_ensure_no_dupe_question_rels()
Create duplicate questions for each question attached to multiple quizzes
Return Return
(void)
Source Source
File: includes/functions/updates/llms-functions-updates-3160.php
function llms_update_3160_ensure_no_dupe_question_rels() { if ( 'complete' !== get_transient( 'llms_update_3160_attempt_migration' ) ) { return true; } $skip = get_transient( 'llms_3160_skipper_dupe_q' ); if ( ! $skip ) { $skip = 0; } set_transient( 'llms_3160_skipper_dupe_q', $skip + 20, DAY_IN_SECONDS ); global $wpdb; $question_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'llms_question' ORDER BY ID ASC LIMIT %d, 20;", $skip ) ); // db call ok; no-cache ok. if ( ! $question_ids ) { set_transient( 'llms_update_3160_ensure_no_dupe_question_rels_status', 'complete', DAY_IN_SECONDS ); return false; } foreach ( $question_ids as $qid ) { $parts = array( serialize( array( 'id' => $qid, ) ), serialize( array( 'id' => absint( $qid ), ) ), ); foreach ( $parts as &$part ) { $part = substr( $part, 5, -1 ); } // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared $quiz_ids = $wpdb->get_col( " SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_llms_questions' AND ( meta_value LIKE '%{$parts[0]}%' OR meta_value LIKE '%{$parts[1]}%' );" ); // db call ok; no-cache ok. // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared // Question is attached to 2 or more quizzes. if ( count( $quiz_ids ) >= 2 ) { // Remove the first quiz and duplicate questions for the remaining quizzes. array_shift( $quiz_ids ); foreach ( $quiz_ids as $quiz_id ) { // Copy the question and add update the reference on the quiz. $question_copy_id = llms_update_util_post_duplicator( $qid ); $questions = get_post_meta( $quiz_id, '_llms_questions', true ); foreach ( $questions as &$qdata ) { if ( $qdata['id'] == $qid ) { $qdata['id'] = $question_copy_id; } } update_post_meta( $quiz_id, '_llms_questions', $questions ); // Update references to the quiz in quiz attempts. // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared $attempt_ids = $wpdb->get_col( " SELECT id FROM {$wpdb->prefix}lifterlms_quiz_attempts WHERE quiz_id = {$quiz_id} AND ( questions LIKE '%{$parts[0]}%' OR questions LIKE '%{$parts[1]}%' );" ); // db call ok; no-cache ok. // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared foreach ( $attempt_ids as $aid ) { $attempt = new LLMS_Quiz_Attempt( $aid ); $attempt_qs = $attempt->get_questions(); foreach ( $attempt_qs as &$answer ) { if ( $answer['id'] == $qid ) { $answer['id'] = $question_copy_id; } } $attempt->set_questions( $attempt_qs, true ); } } } } // Need to run again. return true; }
Expand full source code Collapse full source code View on GitHub
Changelog Changelog
Version | Description |
---|---|
3.16.0 | Introduced. |