Skip to content

Instantly share code, notes, and snippets.

@jom
Last active April 27, 2020 12:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jom/6aab3343df53eeba33d5de48ad4f614b to your computer and use it in GitHub Desktop.
Save jom/6aab3343df53eeba33d5de48ad4f614b to your computer and use it in GitHub Desktop.
Sensei Enrolment Related Snippets
<?php
/**
* Below are some snippets for modifying behavior related to Sensei LMS v3.0.0's new enrolment strategy.
*
* Most of these should be in place prior to upgrading to Sensei LMS 3.0.0.
*
* These may change in later releases and are just meant to be a guide.
*/
<?php
// This enables a feature in Learner Management that allows teachers/admins to hover over `Enrolled` to see a list of
// providers and their individual enrolment status.
add_filter( 'sensei_feature_flag_enrolment_provider_tooltip', '__return_true' );
/**
* With Sensei LMS Status and Tools (https://wordpress.org/plugins/sensei-lms-status-and-tools/) installed
* and activated, this enables a button in Learner Management to quickly debug a learner's enrolment in a course.
*/
add_filter( 'sensei_show_enrolment_debug_button', '__return_true' );
<?php
/**
* Below are some strategies for disabling/changing part of the enrolment system.
*
* Note: This is not officially supported and may break with future releases.
*/
// Disable the enrolment system and have it just use if they have course progress.
add_filter(
'sensei_is_enrolled',
function( $is_enrolled, $user_id, $course_id ) {
return Sensei_Utils::has_started_course( $course_id, $user_id );
},
10,
3
);
// Disable manual enrolment provider (and all other providers).
add_filter( 'sensei_course_enrolment_providers', '__return_empty_array', 100 );
// Disable the background jobs for the enrolment system. Note: This may change and its usage is unsupported.
add_action(
'after_setup_theme',
function() {
if ( ! class_exists( 'Sensei_Course_Enrolment_Manager' ) || ! class_exists( 'Sensei_Enrolment_Job_Scheduler' ) ) {
return;
}
$enrolment_scheduler = Sensei_Enrolment_Job_Scheduler::instance();
remove_action( 'init', [ $enrolment_scheduler, 'maybe_start_learner_calculation' ], 101 );
remove_action( 'sensei_calculate_learner_enrolments', [ $enrolment_scheduler, 'run_learner_calculation' ] );
remove_action( 'sensei_calculate_course_enrolments', [ $enrolment_scheduler, 'run_course_calculation' ] );
remove_action( 'sensei_before_learners_enrolled_courses_query', [ Sensei_Course_Enrolment_Manager::instance(), 'recalculate_enrolments' ] );
}
);
<?php
/**
* Use this filter to ensure manual enrolment is not given to learners with cancelled or otherwise ended
* memberships.
*
* Note: This only runs _once_ during the initial migration. To re-run migration delete all `{db_prefix}sensei_*`
* usermeta. Additionally, this filter is only used for users with course progress.
*/
add_filter( 'sensei_wc_paid_courses_migration_inactive_memberships_provide_manual_enrolment', '__return_false' );
<?php
/**
* Use this filter to change the strategy used to provide manual enrolment.
*
* Note: This only runs _once_ during the initial migration. To re-run migration delete all `{db_prefix}sensei_*`
* usermeta. Additionally, this filter is only used for users with course progress.
*
* Without WooCommerce Paid Courses, all users with course progress will be given manual enrolment.
*
* With WooCommerce Paid Courses installed, manual enrolment will not be given to any user who current is enrolled via
* WooCommerce simple products, subscriptions, or memberships. For subscriptions, it will also attempt to check if they
* might have had a subscription when they started the course. If so, they will not be given manual enrolment.
*/
add_filter(
'sensei_is_legacy_enrolled',
function( $is_legacy_enrolled, $user_id, $course_id, $course_progress_comment_id ) {
// By returning false, we will not give any user manual enrolment on migration.
return false;
},
100,
4
);
<?php
/**
* Partial revert tasks to go from Sensei v3 to v2. Make sure you backup your database before running this. We don't
* support this path so make sure you know what you're doing.
*
* Run this script once after reverting files to Sensei 2.x. Recommended route is using WP-CLI's `eval` command. If you
* have a smaller instance, you can also use the Code Snippet plugin to create a "Run Once" snippet.
*/
global $wpdb;
$legacy_enrolment_time = get_option( 'sensei_enrolment_legacy' );
update_option( 'sensei-version', Sensei()->version );
delete_option( 'sensei-wc-paid-courses-memberships-cancelled-orders' );
delete_option( 'sensei_course_enrolment_site_salt' );
delete_option( 'sensei-scheduler-calculation-version' );
$blog_prefix = preg_quote( $wpdb->get_blog_prefix(), null );
$user_meta_keys = [
'^' . $blog_prefix . 'sensei_learner_calculated_version$',
'^' . $blog_prefix . 'sensei_course_enrolment_[0-9]+$',
'^' . $blog_prefix . 'sensei_enrolment_providers_state$',
'^' . $blog_prefix . 'sensei_enrolment_providers_journal$',
];
foreach ( $user_meta_keys as $meta_key ) {
$wpdb->query(
$wpdb->prepare(
"DELETE FROM {$wpdb->usermeta} WHERE meta_key RLIKE %s",
$meta_key
)
);
}
foreach ( [ 'sensei_learner' ] as $taxonomy ) {
$terms = $wpdb->get_results(
$wpdb->prepare(
"SELECT term_id, term_taxonomy_id FROM $wpdb->term_taxonomy WHERE taxonomy = %s",
$taxonomy
)
);
// Delete all data for each term.
foreach ( $terms as $term ) {
$wpdb->delete( $wpdb->term_relationships, array( 'term_taxonomy_id' => $term->term_taxonomy_id ) );
$wpdb->delete( $wpdb->term_taxonomy, array( 'term_taxonomy_id' => $term->term_taxonomy_id ) );
$wpdb->delete( $wpdb->terms, array( 'term_id' => $term->term_id ) );
$wpdb->delete( $wpdb->termmeta, array( 'term_id' => $term->term_id ) );
}
}
$args = [
'post_type' => 'course',
'post_status' => 'any',
'nopaging' => true,
];
foreach ( get_posts( $args ) as $course ) {
delete_post_meta( $course->ID, '_course_enrolment_version' );
}
delete_option( 'sensei_enrolment_legacy' );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment