$admin_url,
'nonce' => wp_create_nonce('accessally-wp-courseware-convert')
));
}
}
public static function add_menu_pages() {
// Add the top-level admin menu
$capability = 'manage_options';
$menu_slug = self::SETTING_KEY;
$results = add_menu_page('AccessAlly WP Courseware Conversion', 'AccessAlly WP Courseware Conversion', $capability, $menu_slug, array(__CLASS__, 'show_settings'), self::$PLUGIN_URI . 'backend/icon.png');
}
public static function show_settings() {
if (!current_user_can('manage_options')) {
wp_die('You do not have sufficient permissions to access this page.');
}
if (!self::is_accessally_active()) {
wp_die('AccessAlly is not activated or outdated. Please install the latest version of AccessAlly before using the conversion tool.');
}
$operation_code = self::generate_setting_display();
include (dirname(__FILE__) . '/backend/settings-display.php');
}
//
private static function is_accessally_active() {
if (!class_exists('AccessAlly') || !class_exists('AccessAllySettingLicense') || !AccessAllySettingLicense::$accessally_enabled ||
!class_exists('AccessAllyWizardProduct') || !method_exists('AccessAllyWizardProduct', 'merge_default_settings') ||
!class_exists('AccessAllyWizardDrip') || !method_exists('AccessAllyWizardDrip', 'merge_default_settings')) {
return false;
}
return true;
}
//
//
const WP_COURSEWARE_UNIT_SLUG = 'course_unit';
private static $default_settings = array('wizard' => array());
private static function get_wp_courseware_courses() {
global $wpdb;
$wpcw_course_table_name = $wpdb->prefix . 'wpcw_courses';
$wpcw_module_table_name = $wpdb->prefix . 'wpcw_modules';
$wpcw_unit_table_name = $wpdb->prefix . 'wpcw_units_meta';
$unit_rows = $wpdb->get_results("SELECT unit_id, parent_module_id, parent_course_id, unit_order FROM $wpcw_unit_table_name", OBJECT_K);
$unit_meta = array();
foreach ($unit_rows as $unit_row) {
$unit_meta[$unit_row->unit_id] = $unit_row;
}
$all_custom_posts = $wpdb->get_results("SELECT ID, post_type, post_title FROM $wpdb->posts WHERE post_type = '" . self::WP_COURSEWARE_UNIT_SLUG. "'", OBJECT_K);
$custom_post_mapping = array();
foreach ($all_custom_posts as $wpcw_post) {
if (isset($unit_meta[$wpcw_post->ID])) {
$custom_post_mapping[$wpcw_post->ID] = array('post' => $wpcw_post, 'meta' => $unit_meta[$wpcw_post->ID]);
}
}
$course_rows = $wpdb->get_results("SELECT course_id, course_title FROM $wpcw_course_table_name", OBJECT_K);
$courses = array();
foreach ($course_rows as $course_row) {
$courses[$course_row->course_id] = array('raw' => $course_row, 'modules' => array(), 'module-order' => array());
}
$module_rows = $wpdb->get_results("SELECT module_id, parent_course_id, module_title, module_order FROM $wpcw_module_table_name", OBJECT_K);
foreach ($module_rows as $module_row) {
$parent_course_id = $module_row->parent_course_id;
if (isset($courses[$parent_course_id])) {
$courses[$parent_course_id]['modules'][$module_row->module_id] = array('raw' => $module_row, 'units' => array(), 'unit-order' => array());
$courses[$parent_course_id]['module-order'][$module_row->module_id] = $module_row->module_order;
}
}
foreach ($custom_post_mapping as $post_id => $post_details) {
$parent_course_id = $post_details['meta']->parent_course_id;
$parent_module_id = $post_details['meta']->parent_module_id;
if (isset($courses[$parent_course_id])) {
$parent_modules = $courses[$parent_course_id]['modules'];
if (isset($parent_modules[$parent_module_id])) {
$courses[$parent_course_id]['modules'][$parent_module_id]['units'][$post_id] = $post_details;
$courses[$parent_course_id]['modules'][$parent_module_id]['unit-order'][$post_id] = $post_details['meta']->unit_order;
}
}
}
foreach ($courses as $course_id => $course_details) {
asort($courses[$course_id]['module-order']);
foreach ($course_details['modules'] as $module_id => $module_details) {
asort($courses[$course_id]['modules'][$module_id]['unit-order']);
}
}
return $courses;
}
public static function get_settings() {
$setting = get_option(self::SETTING_KEY, false);
if (!is_array($setting)) {
$setting = self::$default_settings;
} else {
$setting = wp_parse_args($setting, self::$default_settings);
}
if (!isset($setting['wizard']) || !is_array($setting['wizard'])) {
$setting['wizard'] = array();
}
return $setting;
}
public static function set_settings($settings) {
$settings = wp_parse_args($settings, self::$default_settings);
$successfully_added = add_option(self::SETTING_KEY, $settings, '', 'no');
if (!$successfully_added) {
update_option(self::SETTING_KEY, $settings);
}
return $settings;
}
//
//
private static function generate_wp_courseware_module_display($module_details) {
$module_db_entry = $module_details['raw'];
$code = '- Module: ' . esc_html($module_db_entry->module_title);
$code .= '';
foreach ($module_details['unit-order'] as $unit_id => $unit_order) {
if (isset($module_details['units'][$unit_id])) {
$unit_details = $module_details['units'][$unit_id];
$unit_post = $unit_details['post'];
$code .= '- ';
$code .= '- Unit: ' . esc_html($unit_post->post_title);
$code .= '
';
}
}
$code .= '
';
return $code;
}
private static function generate_wp_courseware_course_display($code, $course_details) {
$course_db_entry = $course_details['raw'];
$code = str_replace('{{id}}', esc_html($course_db_entry->course_id), $code);
$course_edit_link = admin_url('admin.php?page=WPCW_showPage_ModifyCourse&course_id=' . $course_db_entry->course_id);
$code = str_replace('{{edit-link}}',esc_attr($course_edit_link), $code);
$code = str_replace('{{name}}', esc_html($course_db_entry->course_title), $code);
$details = '';
foreach ($course_details['module-order'] as $module_id => $module_order) {
if (isset($course_details['modules'][$module_id])) {
$module_details = $course_details['modules'][$module_id];
$details .= '- ';
$details .= self::generate_wp_courseware_module_display($module_details);
$details .= '
';
}
}
$details .= '
';
$code = str_replace('{{details}}', $details, $code);
return $code;
}
private static function generate_converted_course_display($row_code, $course_id, $wizard_course, $wizard_url_base) {
$row_code = str_replace('{{name}}', esc_html($wizard_course['name']), $row_code);
if (empty($wizard_course['type'])) {
$row_code = str_replace('{{edit-link}}', '#', $row_code);
$row_code = str_replace('{{show-edit}}', 'style="display:none"', $row_code);
} else {
$row_code = str_replace('{{edit-link}}', esc_attr($wizard_url_base . '&show-' . $wizard_course['type'] . '=' . $wizard_course['option-key']), $row_code);
$row_code = str_replace('{{show-edit}}', '', $row_code);
}
$row_code = str_replace('{{course-id}}', esc_html($course_id), $row_code);
return $row_code;
}
public static function generate_setting_display() {
$code = file_get_contents(dirname(__FILE__) . '/backend/settings-template.php');
$converted_posts = self::get_settings();
$wp_courseware_courses = self::get_wp_courseware_courses();
$wp_courseware_code = '';
$wp_courseware_template = file_get_contents(dirname(__FILE__) . '/backend/convert-template.php');
foreach ($wp_courseware_courses as $course_id => $course_details) {
if (!isset($converted_posts['wizard'][$course_id])) { // do not show already converted courses
$wp_courseware_code .= self::generate_wp_courseware_course_display($wp_courseware_template, $course_details);
}
}
$code = str_replace('{{wp-courseware-courses}}', $wp_courseware_code, $code);
$existing_courses = '';
if (!empty($converted_posts['wizard'])) {
$existing_row_template = file_get_contents(dirname(__FILE__) . '/backend/existing-template.php');
$wizard_url_base = admin_url('admin.php?page=' . AccessAllyWizardShared::SETTING_KEY_WIZARD);
foreach ($converted_posts['wizard'] as $course_id => $wizard_course) {
$existing_courses .= self::generate_converted_course_display($existing_row_template, $course_id, $wizard_course, $wizard_url_base);
}
}
$code = str_replace('{{existing-courses}}', $existing_courses, $code);
if (!empty($existing_courses)) {
$code = str_replace('{{show-existing}}', '', $code);
} else {
$code = str_replace('{{show-existing}}', 'style="display:none"', $code);
}
return $code;
}
//
//
private static $page_setting_template = array('type' => 'page', 'name' => '', 'is-changed' => 'no', 'page-template-select' => '0', 'checked-existing' => 'no',
'status' => 'new', 'post-edit-link' => '#', 'post-id' => 0,
'success-message' => '', 'error-message' => '');
private static function create_new_accessally_wizard_page_with_title($page_title, $module_id = 0) {
$result_page = self::$page_setting_template;
$result_page['name'] = $page_title;
$result_page['is-changed'] = 'yes';
$result_page['checked-existing'] = 'no';
$result_page['module'] = $module_id;
return $result_page;
}
private static function create_accessally_wizard_page_from_raw_db($db_entry, $module_id = 0) {
$result_page = self::$page_setting_template;
$result_page['name'] = $db_entry->post_title;
$result_page['is-changed'] = 'yes';
$result_page['page-template-select'] = $db_entry->ID;
$result_page['checked-existing'] = 'yes';
$result_page['module'] = $module_id;
return $result_page;
}
private static function create_accessally_standalone_course($course_details) {
$wizard_data = AccessAllyWizardProduct::$default_product_settings;
$wizard_data['name'] = 'WP Courseware Course: ' . $course_details['raw']->course_title;
$api_settings = AccessAllySettingSetup::get_api_settings();
$wizard_data['system'] = $api_settings['system'];
$wizard_data['pages'][0] = self::create_new_accessally_wizard_page_with_title($course_details['raw']->course_title, 0);
if (!empty($course_details['modules'])) {
foreach ($course_details['module-order'] as $module_id => $module_order) {
if (isset($course_details['modules'][$module_id])) {
$module_details = $course_details['modules'][$module_id];
foreach ($module_details['unit-order'] as $unit_id => $unit_order) {
if (isset($module_details['units'][$unit_id])) {
$unit_details = $module_details['units'][$unit_id];
$wizard_data['pages'] []= self::create_accessally_wizard_page_from_raw_db($unit_details['post'], 0);
}
}
}
}
}
$wizard_data = AccessAllyWizardProduct::merge_default_settings($wizard_data);
$wizard_data = AccessAllyUtilities::set_incrementing_settings(AccessAllyWizardProduct::SETTING_KEY_WIZARD_PRODUCT,
AccessAllyWizardProduct::SETTING_KEY_WIZARD_PRODUCT_NUMBER, $wizard_data, AccessAllyWizardProduct::$default_product_settings, true, false);
return $wizard_data;
}
private static function create_accessally_stage_release_course($course_details) {
$wizard_data = AccessAllyWizardDrip::$default_drip_settings;
$wizard_data['name'] = 'WP Courseware Course: ' . $course_details['raw']->course_title;
$api_settings = AccessAllySettingSetup::get_api_settings();
$wizard_data['system'] = $api_settings['system'];
$wizard_data['pages'][0] = self::create_new_accessally_wizard_page_with_title($course_details['raw']->course_title, 0);
$module_count = 0;
if (!empty($course_details['modules'])) {
foreach ($course_details['module-order'] as $module_id => $module_order) {
if (isset($course_details['modules'][$module_id])) {
$module_details = $course_details['modules'][$module_id];
++$module_count;
$module_wizard_data = AccessAllyWizardDrip::$default_module_settings;
$module_wizard_data['name'] = $module_details['raw']->module_title;
$wizard_data['modules'][$module_count] = $module_wizard_data;
foreach ($module_details['unit-order'] as $unit_id => $unit_order) {
if (isset($module_details['units'][$unit_id])) {
$unit_details = $module_details['units'][$unit_id];
$wizard_data['pages'] []= self::create_accessally_wizard_page_from_raw_db($unit_details['post'], $module_count);
}
}
}
}
}
$wizard_data = AccessAllyWizardDrip::merge_default_settings($wizard_data);
$wizard_data = AccessAllyUtilities::set_incrementing_settings(AccessAllyWizardDrip::SETTING_KEY_WIZARD_DRIP,
AccessAllyWizardDrip::SETTING_KEY_WIZARD_DRIP_NUMBER, $wizard_data, AccessAllyWizardDrip::$default_drip_settings, true, false);
return $wizard_data;
}
//
//
private static function get_custom_post_to_convert($course_details) {
$result_array = array();
if (!empty($course_details['modules'])) {
foreach ($course_details['module-order'] as $module_id => $module_order) {
if (isset($course_details['modules'][$module_id])) {
$module_details = $course_details['modules'][$module_id];
foreach ($module_details['unit-order'] as $unit_id => $unit_order) {
if (isset($module_details['units'][$unit_id])) {
$unit_details = $module_details['units'][$unit_id];
$result_array []= $unit_details['post']->ID;
}
}
}
}
}
return $result_array;
}
private static function raw_database_update($post_ids, $target_type) {
if (empty($post_ids)) {
return 0;
}
global $wpdb;
$query = $wpdb->prepare("UPDATE {$wpdb->posts} SET post_type = %s WHERE ID in (" . implode(',', $post_ids) . ")", $target_type);
$update_result = $wpdb->query($query);
if (false === $update_result && $wpdb->last_error) {
throw new Exception($wpdb->last_error);
}
return $update_result;
}
//
//
public static function convert_callback() {
$result = array('status' => 'error', 'message' => 'Unknown error. Please refresh the page and try again.');
try {
if (!self::is_accessally_active()) {
throw new Exception('AccessAlly is not activated or outdated. Please install the latest version of AccessAlly before using the conversion tool.');
}
if (!isset($_REQUEST['id']) || !isset($_REQUEST['op']) || !isset($_REQUEST['nonce']) || !wp_verify_nonce($_REQUEST['nonce'], 'accessally-wp-courseware-convert')) {
throw new Exception('The page is outdated. Please refresh and try again.');
}
$course_id = sanitize_text_field($_REQUEST['id']);
$operation = sanitize_text_field($_REQUEST['op']);
if ('alone' !== $operation && 'stage' !== $operation && 'wp' !== $operation) {
throw new Exception('Invalid convert operation. Please refresh and try again.');
}
$wp_courseware_courses = self::get_wp_courseware_courses();
if (!isset($wp_courseware_courses[$course_id])) {
throw new Exception('The WP Courseware course doesn\'t exist. Please refresh and try again.');
}
$course_details = $wp_courseware_courses[$course_id];
$course_db_entry = $course_details['raw'];
$course_name = $course_db_entry->course_title;
$conversion_data = array('name' => $course_name); // assign default value if the course is converted without creating a wizard course
if ('stage' === $operation) {
$created_course = self::create_accessally_stage_release_course($course_details);
$conversion_data = array('type' => 'stage', 'option-key' => $created_course['option-key'], 'name' => $created_course['name']);
} elseif ('alone' === $operation) {
$created_course = self::create_accessally_standalone_course($course_details);
$conversion_data = array('type' => 'alone', 'option-key' => $created_course['option-key'], 'name' => $created_course['name']);
}
$pages_to_convert = self::get_custom_post_to_convert($course_details);
self::raw_database_update($pages_to_convert, 'page');
$conversion_data['converted'] = $pages_to_convert;
$conversion_history = self::get_settings();
$conversion_history['wizard'][$course_id] = $conversion_data;
self::set_settings($conversion_history);
$code = self::generate_setting_display();
$result = array('status' => 'success', 'message' => 'The WP Courseware Course has been converted.', 'code' => $code);
} catch (Exception $e) {
$result['status'] = 'error';
$result['message'] = $e->getMessage() . ' Please refresh the page and try again.';
}
echo json_encode($result);
die();
}
public static function revert_callback() {
$result = array('status' => 'error', 'message' => 'Unknown error. Please refresh the page and try again.');
try {
if (!self::is_accessally_active()) {
throw new Exception('AccessAlly is not activated or outdated. Please install the latest version of AccessAlly before using the conversion tool.');
}
if (!isset($_REQUEST['id']) || !isset($_REQUEST['nonce']) || !wp_verify_nonce($_REQUEST['nonce'], 'accessally-wp-courseware-convert')) {
throw new Exception('The page is outdated. Please refresh and try again.');
}
$course_id = sanitize_text_field($_REQUEST['id']);
$conversion_history = self::get_settings();
if (!isset($conversion_history['wizard'][$course_id])) {
throw new Exception('Invalid course. Please refresh and try again.');
}
$converted_data = $conversion_history['wizard'][$course_id];
$converted_pages = $converted_data['converted'];
self::raw_database_update($converted_pages, self::WP_COURSEWARE_UNIT_SLUG);
unset($conversion_history['wizard'][$course_id]);
self::set_settings($conversion_history);
$code = self::generate_setting_display();
$result = array('status' => 'success', 'message' => 'Reverting pages to WP Courseware format completed.', 'code' => $code);
} catch (Exception $e) {
$result['status'] = 'error';
$result['message'] = $e->getMessage() . ' Please refresh the page and try again.';
}
echo json_encode($result);
die();
}
//
}
AccessAlly_WpCoursewareConversion::init();
}