woothemes /
sensei
This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
| 1 | <?php |
||
| 2 | if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly |
||
| 3 | |||
| 4 | /** |
||
| 5 | * Handles all admin views, assets and navigation. |
||
| 6 | * |
||
| 7 | * @package Views |
||
| 8 | * @author Automattic |
||
| 9 | * @since 1.0.0 |
||
| 10 | */ |
||
| 11 | class Sensei_Admin { |
||
| 12 | |||
| 13 | /** |
||
| 14 | * Constructor. |
||
| 15 | * @since 1.0.0 |
||
| 16 | */ |
||
| 17 | public function __construct () { |
||
| 18 | |||
| 19 | //register admin styles |
||
| 20 | add_action( 'admin_enqueue_scripts', array( $this, 'admin_styles_global' ) ); |
||
| 21 | |||
| 22 | //register admin scripts |
||
| 23 | add_action( 'admin_enqueue_scripts', array( $this, 'register_scripts' ) ); |
||
| 24 | |||
| 25 | add_action( 'admin_print_styles', array( $this, 'admin_notices_styles' ) ); |
||
| 26 | add_action( 'settings_before_form', array( $this, 'install_pages_output' ) ); |
||
| 27 | add_action( 'admin_menu', array( $this, 'admin_menu' ), 10 ); |
||
| 28 | add_action( 'menu_order', array( $this, 'admin_menu_order' ) ); |
||
| 29 | add_action( 'admin_head', array( $this, 'admin_menu_highlight' ) ); |
||
| 30 | add_action( 'admin_init', array( $this, 'page_redirect' ) ); |
||
| 31 | add_action( 'admin_init', array( $this, 'sensei_add_custom_menu_items' ) ); |
||
| 32 | add_action( 'admin_init', array( __CLASS__, 'install_pages' )); |
||
| 33 | |||
| 34 | // Duplicate lesson & courses |
||
| 35 | add_filter( 'post_row_actions', array( $this, 'duplicate_action_link' ), 10, 2 ); |
||
| 36 | add_action( 'admin_action_duplicate_lesson', array( $this, 'duplicate_lesson_action' ) ); |
||
| 37 | add_action( 'admin_action_duplicate_course', array( $this, 'duplicate_course_action' ) ); |
||
| 38 | add_action( 'admin_action_duplicate_course_with_lessons', array( $this, 'duplicate_course_with_lessons_action' ) ); |
||
| 39 | |||
| 40 | // Handle lessons list table filtering |
||
| 41 | add_action( 'restrict_manage_posts', array( $this, 'lesson_filter_options' ) ); |
||
| 42 | add_filter( 'request', array( $this, 'lesson_filter_actions' ) ); |
||
| 43 | |||
| 44 | // Add Sensei items to 'at a glance' widget |
||
| 45 | add_filter( 'dashboard_glance_items', array( $this, 'glance_items' ), 10, 1 ); |
||
| 46 | |||
| 47 | // Handle course and lesson deletions |
||
| 48 | add_action( 'trash_course', array( $this, 'delete_content' ), 10, 2 ); |
||
| 49 | add_action( 'trash_lesson', array( $this, 'delete_content' ), 10, 2 ); |
||
| 50 | |||
| 51 | // Delete user activity when user is deleted |
||
| 52 | add_action( 'deleted_user', array( $this, 'delete_user_activity' ), 10, 1 ); |
||
| 53 | |||
| 54 | // Add notices to WP dashboard |
||
| 55 | add_action( 'admin_notices', array( $this, 'theme_compatibility_notices' ) ); |
||
| 56 | |||
| 57 | // Reset theme notices when switching themes |
||
| 58 | add_action( 'switch_theme', array( $this, 'reset_theme_check_notices' ) ); |
||
| 59 | |||
| 60 | // Allow Teacher access the admin area |
||
| 61 | add_filter( 'woocommerce_prevent_admin_access', array( $this, 'admin_access' ) ); |
||
| 62 | |||
| 63 | } // End __construct() |
||
| 64 | |||
| 65 | /** |
||
| 66 | * Add items to admin menu |
||
| 67 | * @since 1.4.0 |
||
| 68 | * @return void |
||
| 69 | */ |
||
| 70 | public function admin_menu() { |
||
| 71 | global $menu; |
||
| 72 | $menu_cap = ''; |
||
| 73 | if( current_user_can( 'manage_sensei' ) ) { |
||
| 74 | $menu_cap = 'manage_sensei'; |
||
| 75 | } else { |
||
| 76 | if( current_user_can( 'manage_sensei_grades' ) ) { |
||
| 77 | $menu_cap = 'manage_sensei_grades'; |
||
| 78 | } |
||
| 79 | } |
||
| 80 | |||
| 81 | if( $menu_cap ) { |
||
| 82 | $menu[] = array( '', 'read', 'separator-sensei', '', 'wp-menu-separator sensei' ); |
||
| 83 | add_menu_page( 'Sensei', 'Sensei', $menu_cap, 'sensei' , array( Sensei()->analysis, 'analysis_page' ) , '', '50' ); |
||
| 84 | } |
||
| 85 | |||
| 86 | add_submenu_page( 'edit.php?post_type=course', __( 'Order Courses', 'woothemes-sensei' ), __( 'Order Courses', 'woothemes-sensei' ), 'manage_sensei', 'course-order', array( $this, 'course_order_screen' ) ); |
||
| 87 | add_submenu_page( 'edit.php?post_type=lesson', __( 'Order Lessons', 'woothemes-sensei' ), __( 'Order Lessons', 'woothemes-sensei' ), 'edit_lessons', 'lesson-order', array( $this, 'lesson_order_screen' ) ); |
||
| 88 | } |
||
| 89 | |||
| 90 | /** |
||
| 91 | * [admin_menu_order description] |
||
| 92 | * @since 1.4.0 |
||
| 93 | * @param array $menu_order Existing menu order |
||
| 94 | * @return array Modified menu order for Sensei |
||
| 95 | */ |
||
| 96 | public function admin_menu_order( $menu_order ) { |
||
| 97 | |||
| 98 | // Initialize our custom order array |
||
| 99 | $sensei_menu_order = array(); |
||
| 100 | |||
| 101 | // Get the index of our custom separator |
||
| 102 | $sensei_separator = array_search( 'separator-sensei', $menu_order ); |
||
| 103 | |||
| 104 | // Loop through menu order and do some rearranging |
||
| 105 | foreach ( $menu_order as $index => $item ) : |
||
| 106 | |||
| 107 | if ( ( ( 'sensei' ) == $item ) ) : |
||
| 108 | $sensei_menu_order[] = 'separator-sensei'; |
||
| 109 | $sensei_menu_order[] = $item; |
||
| 110 | unset( $menu_order[$sensei_separator] ); |
||
| 111 | elseif ( !in_array( $item, array( 'separator-sensei' ) ) ) : |
||
| 112 | $sensei_menu_order[] = $item; |
||
| 113 | endif; |
||
| 114 | |||
| 115 | endforeach; |
||
| 116 | |||
| 117 | // Return order |
||
| 118 | return $sensei_menu_order; |
||
| 119 | } |
||
| 120 | |||
| 121 | /** |
||
| 122 | * Handle highlighting of admin menu items |
||
| 123 | * @since 1.4.0 |
||
| 124 | * @return void |
||
| 125 | */ |
||
| 126 | public function admin_menu_highlight() { |
||
| 127 | global $menu, $submenu, $parent_file, $submenu_file, $self, $post_type, $taxonomy; |
||
| 128 | |||
| 129 | $screen = get_current_screen(); |
||
| 130 | |||
| 131 | if( empty( $screen ) ){ |
||
| 132 | return; |
||
| 133 | } |
||
| 134 | |||
| 135 | if ( $screen->base == 'post' && $post_type == 'course' ) { |
||
| 136 | |||
| 137 | $parent_file = 'edit.php?post_type=course'; |
||
| 138 | |||
| 139 | } elseif ( $screen->base == 'edit-tags' && $taxonomy == 'course-category' ) { |
||
| 140 | |||
| 141 | $submenu_file = 'edit-tags.php?taxonomy=course-category&post_type=course'; |
||
| 142 | $parent_file = 'edit.php?post_type=course'; |
||
| 143 | |||
| 144 | } elseif ( $screen->base == 'edit-tags' && $taxonomy == 'module' ) { |
||
| 145 | |||
| 146 | $submenu_file = 'edit-tags.php?taxonomy=module'; |
||
| 147 | $parent_file = 'edit.php?post_type=course'; |
||
| 148 | |||
| 149 | } elseif ( in_array( $screen->id, array( 'sensei_message', 'edit-sensei_message' ) ) ) { |
||
| 150 | |||
| 151 | $submenu_file = 'edit.php?post_type=sensei_message'; |
||
| 152 | $parent_file = 'sensei'; |
||
| 153 | |||
| 154 | } |
||
| 155 | } |
||
| 156 | |||
| 157 | /** |
||
| 158 | * Redirect Sensei menu item to Analysis page |
||
| 159 | * @since 1.4.0 |
||
| 160 | * @return void |
||
| 161 | */ |
||
| 162 | public function page_redirect() { |
||
| 163 | if( isset( $_GET['page'] ) && $_GET['page'] == 'sensei' ) { |
||
| 164 | wp_safe_redirect( 'admin.php?page=sensei_analysis' ); |
||
| 165 | exit; |
||
| 166 | } |
||
| 167 | } |
||
| 168 | |||
| 169 | /** |
||
| 170 | * install_pages_output function. |
||
| 171 | * |
||
| 172 | * Handles installation of the 2 pages needs for courses and my courses |
||
| 173 | * |
||
| 174 | * @access public |
||
| 175 | * @return void |
||
| 176 | */ |
||
| 177 | function install_pages_output() { |
||
| 178 | |||
| 179 | if( isset($_GET['sensei_install_complete']) && 'true' == $_GET['sensei_install_complete']) { |
||
| 180 | |||
| 181 | ?> |
||
| 182 | <div id="message" class="updated sensei-message sensei-connect"> |
||
| 183 | <p><?php _e( '<strong>Congratulations!</strong> – Sensei has been installed and set up.', 'woothemes-sensei' ); ?></p> |
||
| 184 | <p><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.woothemes.com/sensei/" data-text="A premium Learning Management plugin for #WordPress that helps you create courses. Beautifully." data-via="WooThemes" data-size="large" data-hashtags="Sensei">Tweet</a> |
||
| 185 | <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script></p> |
||
| 186 | </div> |
||
| 187 | <?php |
||
| 188 | |||
| 189 | } |
||
| 190 | |||
| 191 | } // End install_pages_output() |
||
| 192 | |||
| 193 | |||
| 194 | /** |
||
| 195 | * create_page function. |
||
| 196 | * |
||
| 197 | * @access public |
||
| 198 | * @param mixed $slug |
||
| 199 | * @param mixed $option |
||
| 200 | * @param string $page_title (default: '') |
||
| 201 | * @param string $page_content (default: '') |
||
| 202 | * @param int $post_parent (default: 0) |
||
| 203 | * @return integer $page_id |
||
| 204 | */ |
||
| 205 | function create_page( $slug, $page_title = '', $page_content = '', $post_parent = 0 ) { |
||
| 206 | global $wpdb; |
||
| 207 | |||
| 208 | $page_id = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM " . $wpdb->posts . " WHERE post_name = %s LIMIT 1;", $slug ) ); |
||
| 209 | if ( $page_id ) : |
||
| 210 | return $page_id; |
||
| 211 | endif; |
||
| 212 | |||
| 213 | $page_data = array( |
||
| 214 | 'post_status' => 'publish', |
||
| 215 | 'post_type' => 'page', |
||
| 216 | 'post_author' => 1, |
||
| 217 | 'post_name' => $slug, |
||
| 218 | 'post_title' => $page_title, |
||
| 219 | 'post_content' => $page_content, |
||
| 220 | 'post_parent' => $post_parent, |
||
| 221 | 'comment_status' => 'closed' |
||
| 222 | ); |
||
| 223 | |||
| 224 | $page_id = wp_insert_post( $page_data ); |
||
| 225 | |||
| 226 | return $page_id; |
||
| 227 | |||
| 228 | } // End create_page() |
||
| 229 | |||
| 230 | |||
| 231 | /** |
||
| 232 | * create_pages function. |
||
| 233 | * |
||
| 234 | * @access public |
||
| 235 | * @return void |
||
| 236 | */ |
||
| 237 | function create_pages() { |
||
| 238 | |||
| 239 | // Courses page |
||
| 240 | $new_course_page_id = $this->create_page( esc_sql( _x('courses-overview', 'page_slug', 'woothemes-sensei') ), __('Courses', 'woothemes-sensei'), '' ); |
||
| 241 | Sensei()->settings->set( 'course_page', $new_course_page_id ); |
||
| 242 | |||
| 243 | // User Dashboard page |
||
| 244 | $new_my_course_page_id = $this->create_page( esc_sql( _x('my-courses', 'page_slug', 'woothemes-sensei') ), __('My Courses', 'woothemes-sensei'), '[sensei_user_courses]' ); |
||
| 245 | Sensei()->settings->set( 'my_course_page',$new_my_course_page_id ); |
||
| 246 | |||
| 247 | } // End create_pages() |
||
| 248 | |||
| 249 | /** |
||
| 250 | * Load the global admin styles for the menu icon and the relevant page icon. |
||
| 251 | * @access public |
||
| 252 | * @since 1.0.0 |
||
| 253 | * @return void |
||
| 254 | */ |
||
| 255 | public function admin_styles_global ( $hook ) { |
||
| 256 | global $post_type; |
||
| 257 | |||
| 258 | $allowed_post_types = apply_filters( 'sensei_scripts_allowed_post_types', array( 'lesson', 'course', 'question' ) ); |
||
| 259 | $allowed_post_type_pages = apply_filters( 'sensei_scripts_allowed_post_type_pages', array( 'edit.php', 'post-new.php', 'post.php', 'edit-tags.php' ) ); |
||
| 260 | $allowed_pages = apply_filters( 'sensei_scripts_allowed_pages', array( 'sensei_grading', 'sensei_analysis', 'sensei_learners', 'sensei_updates', 'woothemes-sensei-settings', 'lesson-order', 'course-order' ) ); |
||
| 261 | |||
| 262 | // Global Styles for icons and menu items |
||
| 263 | wp_register_style( 'woothemes-sensei-global', Sensei()->plugin_url . 'assets/css/global.css', '', Sensei()->version, 'screen' ); |
||
| 264 | wp_enqueue_style( 'woothemes-sensei-global' ); |
||
| 265 | |||
| 266 | // Select 2 styles |
||
| 267 | wp_enqueue_style( 'sensei-core-select2', Sensei()->plugin_url . 'assets/css/select2/select2.css', '', Sensei()->version, 'screen' ); |
||
| 268 | |||
| 269 | // Test for Write Panel Pages |
||
| 270 | View Code Duplication | if ( ( ( isset( $post_type ) && in_array( $post_type, $allowed_post_types ) ) && ( isset( $hook ) && in_array( $hook, $allowed_post_type_pages ) ) ) || ( isset( $_GET['page'] ) && in_array( $_GET['page'], $allowed_pages ) ) ) { |
|
| 271 | |||
| 272 | wp_register_style( 'woothemes-sensei-admin-custom', Sensei()->plugin_url . 'assets/css/admin-custom.css', '', Sensei()->version, 'screen' ); |
||
| 273 | wp_enqueue_style( 'woothemes-sensei-admin-custom' ); |
||
| 274 | |||
| 275 | } |
||
| 276 | |||
| 277 | } // End admin_styles_global() |
||
| 278 | |||
| 279 | |||
| 280 | /** |
||
| 281 | * Globally register all scripts needed in admin. |
||
| 282 | * |
||
| 283 | * The script users should enqueue the script when needed. |
||
| 284 | * |
||
| 285 | * @since 1.8.2 |
||
| 286 | * @access public |
||
| 287 | */ |
||
| 288 | public function register_scripts( $hook ){ |
||
| 289 | |||
| 290 | $screen = get_current_screen(); |
||
| 291 | |||
| 292 | // Allow developers to load non-minified versions of scripts |
||
| 293 | $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; |
||
| 294 | |||
| 295 | // Select2 script used to enhance all select boxes |
||
| 296 | wp_register_script( 'sensei-core-select2', Sensei()->plugin_url . '/assets/js/select2/select2' . $suffix . '.js', array( 'jquery' ), Sensei()->version ); |
||
| 297 | |||
| 298 | // load edit module scripts |
||
| 299 | if( 'edit-module' == $screen->id ){ |
||
| 300 | |||
| 301 | wp_enqueue_script( 'sensei-chosen-ajax', Sensei()->plugin_url . 'assets/chosen/ajax-chosen.jquery.min.js', array( 'jquery', 'sensei-chosen' ), Sensei()->version, true ); |
||
| 302 | |||
| 303 | } |
||
| 304 | |||
| 305 | } |
||
| 306 | |||
| 307 | |||
| 308 | /** |
||
| 309 | * admin_install_notice function. |
||
| 310 | * |
||
| 311 | * @access public |
||
| 312 | * @return void |
||
| 313 | */ |
||
| 314 | function admin_install_notice() { |
||
| 315 | ?> |
||
| 316 | <div id="message" class="updated sensei-message sensei-connect"> |
||
| 317 | |||
| 318 | <p> |
||
| 319 | <?php _e( '<strong>Welcome to Sensei</strong> – You\'re almost ready to create some courses!', 'woothemes-sensei' ); ?> |
||
| 320 | </p> |
||
| 321 | |||
| 322 | <p class="submit"> |
||
| 323 | |||
| 324 | <a href="<?php echo esc_url( add_query_arg('install_sensei_pages', 'true', admin_url('admin.php?page=woothemes-sensei-settings') ) ); ?>" |
||
| 325 | class="button-primary"> |
||
| 326 | |||
| 327 | <?php _e( 'Install Sensei Pages', 'woothemes-sensei' ); ?> |
||
| 328 | |||
| 329 | </a> |
||
| 330 | |||
| 331 | <a class="skip button" href="<?php echo esc_url( add_query_arg( 'skip_install_sensei_pages', 'true', admin_url('admin.php?page=woothemes-sensei-settings' ) ) ); ?>"> |
||
| 332 | |||
| 333 | <?php _e('Skip setup', 'woothemes-sensei'); ?> |
||
| 334 | |||
| 335 | </a> |
||
| 336 | |||
| 337 | </p> |
||
| 338 | </div> |
||
| 339 | <?php |
||
| 340 | } // End admin_install_notice() |
||
| 341 | |||
| 342 | |||
| 343 | /** |
||
| 344 | * admin_installed_notice function. |
||
| 345 | * |
||
| 346 | * @access public |
||
| 347 | * @return void |
||
| 348 | */ |
||
| 349 | function admin_installed_notice() { |
||
| 350 | ?> |
||
| 351 | <div id="message" class="updated sensei-message sensei-connect"> |
||
| 352 | |||
| 353 | <p> |
||
| 354 | <?php _e( '<strong>Sensei has been installed</strong> – You\'re ready to start creating courses!', 'woothemes-sensei' ); ?> |
||
| 355 | </p> |
||
| 356 | |||
| 357 | <p class="submit"> |
||
| 358 | <a href="<?php echo admin_url('admin.php?page=woothemes-sensei-settings'); ?>" class="button-primary"><?php _e( 'Settings', 'woothemes-sensei' ); ?></a> <a class="docs button" href="http://www.woothemes.com/sensei-docs/"> |
||
| 359 | <?php _e('Documentation', 'woothemes-sensei'); ?> |
||
| 360 | </a> |
||
| 361 | </p> |
||
| 362 | |||
| 363 | <p> |
||
| 364 | |||
| 365 | <a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.woothemes.com/sensei/" data-text="A premium Learning Management plugin for #WordPress that helps you teach courses online. Beautifully." data-via="WooThemes" data-size="large" data-hashtags="Sensei"> |
||
| 366 | <?php _e('Tweet', 'woothemes-sensei'); ?> |
||
| 367 | </a> |
||
| 368 | |||
| 369 | <script> |
||
| 370 | !function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs"); |
||
| 371 | </script> |
||
| 372 | |||
| 373 | </p> |
||
| 374 | |||
| 375 | </div> |
||
| 376 | <?php |
||
| 377 | |||
| 378 | // Set installed option |
||
| 379 | update_option('sensei_installed', 0); |
||
| 380 | } // End admin_installed_notice() |
||
| 381 | |||
| 382 | |||
| 383 | /** |
||
| 384 | * Language pack install notice. |
||
| 385 | * |
||
| 386 | * @since 1.9.0 |
||
| 387 | */ |
||
| 388 | public function language_pack_install_notice() { |
||
| 389 | ?> |
||
| 390 | <div id="message" class="updated sensei-message sensei-connect"> |
||
| 391 | <p><?php _e( '<strong>Sensei in your language</strong> – There is a translation available for your language.', 'woothemes-sensei' ); ?><p> |
||
| 392 | |||
| 393 | <p class="submit"> |
||
| 394 | <a href="<?php echo esc_url( Sensei_Language_Pack_Manager::get_install_uri() ); ?>" class="button-primary"><?php _e( 'Install', 'woothemes-sensei' ); ?></a> |
||
| 395 | <a href="<?php echo esc_url( Sensei_Language_Pack_Manager::get_dismiss_uri() ) ?>" class="docs button"><?php _e( 'Hide this notice', 'woothemes-sensei' ); ?></a> |
||
| 396 | </p> |
||
| 397 | </div> |
||
| 398 | <?php |
||
| 399 | } |
||
| 400 | |||
| 401 | |||
| 402 | /** |
||
| 403 | * admin_notices_styles function. |
||
| 404 | * |
||
| 405 | * @access public |
||
| 406 | * @return void |
||
| 407 | */ |
||
| 408 | function admin_notices_styles() { |
||
| 409 | |||
| 410 | // Installed notices |
||
| 411 | if ( 1 == get_option( 'sensei_installed' ) ) { |
||
| 412 | |||
| 413 | wp_enqueue_style( 'sensei-activation', plugins_url( '/assets/css/activation.css', dirname( __FILE__ ) ), '', Sensei()->version ); |
||
| 414 | |||
| 415 | if (get_option('skip_install_sensei_pages')!=1 && Sensei()->get_page_id('course')<1 && !isset($_GET['install_sensei_pages']) && !isset($_GET['skip_install_sensei_pages'])) { |
||
| 416 | add_action( 'admin_notices', array( $this, 'admin_install_notice' ) ); |
||
| 417 | } elseif ( !isset($_GET['page']) || $_GET['page']!='woothemes-sensei-settings' ) { |
||
| 418 | add_action( 'admin_notices', array( $this, 'admin_installed_notice' ) ); |
||
| 419 | } // End If Statement |
||
| 420 | |||
| 421 | } // End If Statement |
||
| 422 | |||
| 423 | if ( Sensei_Language_Pack_Manager::has_language_pack_available() ) { |
||
| 424 | add_action( 'admin_notices', array( $this, 'language_pack_install_notice' ) ); |
||
| 425 | } |
||
| 426 | |||
| 427 | } // End admin_notices_styles() |
||
| 428 | |||
| 429 | /** |
||
| 430 | * Add links for duplicating lessons & courses |
||
| 431 | * @param array $actions Default actions |
||
| 432 | * @param object $post Current post |
||
| 433 | * @return array Modified actions |
||
| 434 | */ |
||
| 435 | public function duplicate_action_link( $actions, $post ) { |
||
| 436 | switch( $post->post_type ) { |
||
| 437 | case 'lesson': |
||
| 438 | $confirm = __( 'This will duplicate the lesson quiz and all of its questions. Are you sure you want to do this?', 'woothemes-sensei' ); |
||
| 439 | $actions['duplicate'] = "<a onclick='return confirm(\"" . $confirm . "\");' href='" . $this->get_duplicate_link( $post->ID ) . "' title='" . esc_attr(__( 'Duplicate this lesson', 'woothemes-sensei' ) ) . "'>" . __('Duplicate', 'woothemes-sensei' ) . "</a>"; |
||
| 440 | break; |
||
| 441 | |||
| 442 | case 'course': |
||
| 443 | $confirm = __( 'This will duplicate the course lessons along with all of their quizzes and questions. Are you sure you want to do this?', 'woothemes-sensei' ); |
||
| 444 | $actions['duplicate'] = '<a href="' . $this->get_duplicate_link( $post->ID ) . '" title="' . esc_attr(__( 'Duplicate this course', 'woothemes-sensei' ) ) . '">' . __('Duplicate', 'woothemes-sensei' ) . '</a>'; |
||
| 445 | $actions['duplicate_with_lessons'] = '<a onclick="return confirm(\'' . $confirm . '\');" href="' . $this->get_duplicate_link( $post->ID, true ) . '" title="' . esc_attr(__( 'Duplicate this course with its lessons', 'woothemes-sensei' ) ) . '">' . __('Duplicate (with lessons)', 'woothemes-sensei' ) . '</a>'; |
||
| 446 | break; |
||
| 447 | } |
||
| 448 | |||
| 449 | return $actions; |
||
| 450 | } |
||
| 451 | |||
| 452 | /** |
||
| 453 | * Generate duplicationlink |
||
| 454 | * @param integer $post_id Post ID |
||
| 455 | * @param boolean $with_lessons Include lessons or not |
||
| 456 | * @return string Duplication link |
||
| 457 | */ |
||
| 458 | private function get_duplicate_link( $post_id = 0, $with_lessons = false ) { |
||
| 459 | |||
| 460 | $post = get_post( $post_id ); |
||
| 461 | |||
| 462 | $action = 'duplicate_' . $post->post_type; |
||
| 463 | |||
| 464 | if( 'course' == $post->post_type && $with_lessons ) { |
||
| 465 | $action .= '_with_lessons'; |
||
| 466 | } |
||
| 467 | |||
| 468 | return apply_filters( $action . '_link', admin_url( 'admin.php?action=' . $action . '&post=' . $post_id ), $post_id ); |
||
| 469 | } |
||
| 470 | |||
| 471 | /** |
||
| 472 | * Duplicate lesson |
||
| 473 | * @return void |
||
| 474 | */ |
||
| 475 | public function duplicate_lesson_action() { |
||
| 476 | $this->duplicate_content( 'lesson' ); |
||
| 477 | } |
||
| 478 | |||
| 479 | /** |
||
| 480 | * Duplicate course |
||
| 481 | * @return void |
||
| 482 | */ |
||
| 483 | public function duplicate_course_action() { |
||
| 484 | $this->duplicate_content( 'course' ); |
||
| 485 | } |
||
| 486 | |||
| 487 | /** |
||
| 488 | * Duplicate course with lessons |
||
| 489 | * @return void |
||
| 490 | */ |
||
| 491 | public function duplicate_course_with_lessons_action() { |
||
| 492 | $this->duplicate_content( 'course', true ); |
||
| 493 | } |
||
| 494 | |||
| 495 | /** |
||
| 496 | * Duplicate content |
||
| 497 | * @param string $post_type Post type being duplicated |
||
| 498 | * @param boolean $with_lessons Include lessons or not |
||
| 499 | * @return void |
||
| 500 | */ |
||
| 501 | private function duplicate_content( $post_type = 'lesson', $with_lessons = false ) { |
||
| 502 | if ( ! isset( $_GET['post'] ) ) { |
||
| 503 | wp_die( sprintf( __( 'Please supply a %1$s ID.', 'woothemes-sensei' ) ), $post_type ); |
||
| 504 | } |
||
| 505 | |||
| 506 | $post_id = $_GET['post']; |
||
| 507 | $post = get_post( $post_id ); |
||
| 508 | |||
| 509 | if( ! is_wp_error( $post ) ) { |
||
| 510 | |||
| 511 | $new_post = $this->duplicate_post( $post ); |
||
| 512 | |||
| 513 | if( $new_post && ! is_wp_error( $new_post ) ) { |
||
| 514 | |||
| 515 | if( 'lesson' == $new_post->post_type ) { |
||
| 516 | $this->duplicate_lesson_quizzes( $post_id, $new_post->ID ); |
||
| 517 | } |
||
| 518 | |||
| 519 | if( 'course' == $new_post->post_type && $with_lessons ) { |
||
| 520 | $this->duplicate_course_lessons( $post_id, $new_post->ID ); |
||
| 521 | } |
||
| 522 | |||
| 523 | $redirect_url = admin_url( 'post.php?post=' . $new_post->ID . '&action=edit' ); |
||
| 524 | } else { |
||
| 525 | $redirect_url = admin_url( 'edit.php?post_type=' . $post->post_type . '&message=duplicate_failed' ); |
||
| 526 | } |
||
| 527 | |||
| 528 | wp_safe_redirect( esc_url_raw( $redirect_url ) ); |
||
| 529 | exit; |
||
| 530 | } |
||
| 531 | } |
||
| 532 | |||
| 533 | /** |
||
| 534 | * Duplicate quizzes inside lessons |
||
| 535 | * @param integer $old_lesson_id ID of original lesson |
||
| 536 | * @param integer $new_lesson_id ID of duplicate lesson |
||
| 537 | * @return void |
||
| 538 | */ |
||
| 539 | private function duplicate_lesson_quizzes( $old_lesson_id, $new_lesson_id ) { |
||
| 540 | |||
| 541 | $old_quiz_id = Sensei()->lesson->lesson_quizzes( $old_lesson_id ); |
||
| 542 | $old_quiz_questions = Sensei()->lesson->lesson_quiz_questions( $old_quiz_id ); |
||
| 543 | |||
| 544 | // duplicate the generic wp post information |
||
| 545 | $new_quiz = $this->duplicate_post( get_post( $old_quiz_id ), '' ); |
||
| 546 | |||
| 547 | //update the new lesson data |
||
| 548 | add_post_meta( $new_lesson_id, '_lesson_quiz', $new_quiz->ID ); |
||
| 549 | |||
| 550 | //update the new quiz data |
||
| 551 | add_post_meta( $new_quiz->ID, '_quiz_lesson', $new_lesson_id ); |
||
| 552 | wp_update_post( |
||
| 553 | array( |
||
| 554 | 'ID' => $new_quiz->ID, |
||
| 555 | 'post_parent' => $new_lesson_id |
||
| 556 | ) |
||
| 557 | ); |
||
| 558 | |||
| 559 | foreach( $old_quiz_questions as $question ) { |
||
| 560 | |||
| 561 | // copy the question order over to the new quiz |
||
| 562 | $old_question_order = get_post_meta( $question->ID, '_quiz_question_order'. $old_quiz_id, true ); |
||
| 563 | $new_question_order = str_ireplace( $old_quiz_id, $new_quiz->ID , $old_question_order ); |
||
| 564 | add_post_meta( $question->ID, '_quiz_question_order' . $new_quiz->ID, $new_question_order ); |
||
| 565 | |||
| 566 | // Add question to quiz |
||
| 567 | add_post_meta( $question->ID, '_quiz_id', $new_quiz->ID, false ); |
||
| 568 | |||
| 569 | } |
||
| 570 | } |
||
| 571 | |||
| 572 | /** |
||
| 573 | * Duplicate lessons inside a course |
||
| 574 | * @param integer $old_course_id ID of original course |
||
| 575 | * @param integer $new_course_id ID of duplicated course |
||
| 576 | * @return void |
||
| 577 | */ |
||
| 578 | private function duplicate_course_lessons( $old_course_id, $new_course_id ) { |
||
| 579 | $lesson_args = array( |
||
| 580 | 'post_type' => 'lesson', |
||
| 581 | 'posts_per_page' => -1, |
||
| 582 | 'meta_key' => '_lesson_course', |
||
| 583 | 'meta_value' => $old_course_id, |
||
| 584 | 'suppress_filters' => 0 |
||
| 585 | ); |
||
| 586 | $lessons = get_posts( $lesson_args ); |
||
| 587 | |||
| 588 | foreach( $lessons as $lesson ) { |
||
| 589 | $new_lesson = $this->duplicate_post( $lesson, '', true ); |
||
| 590 | add_post_meta( $new_lesson->ID, '_lesson_course', $new_course_id ); |
||
| 591 | |||
| 592 | $this->duplicate_lesson_quizzes( $lesson->ID, $new_lesson->ID ); |
||
| 593 | } |
||
| 594 | } |
||
| 595 | |||
| 596 | /** |
||
| 597 | * Duplicate post |
||
| 598 | * @param object $post Post to be duplicated |
||
| 599 | * @param string $suffix Suffix for duplicated post title |
||
| 600 | * @param boolean $ignore_course Ignore lesson course when dulicating |
||
| 601 | * @return object Duplicate post object |
||
| 602 | */ |
||
| 603 | private function duplicate_post( $post, $suffix = ' (Duplicate)', $ignore_course = false ) { |
||
| 604 | |||
| 605 | $new_post = array(); |
||
| 606 | |||
| 607 | foreach( $post as $k => $v ) { |
||
| 608 | if( ! in_array( $k, array( 'ID', 'post_status', 'post_date', 'post_date_gmt', 'post_name', 'post_modified', 'post_modified_gmt', 'guid', 'comment_count' ) ) ) { |
||
| 609 | $new_post[ $k ] = $v; |
||
| 610 | } |
||
| 611 | } |
||
| 612 | |||
| 613 | $new_post['post_title'] .= __( $suffix, 'woothemes-sensei' ); |
||
| 614 | |||
| 615 | $new_post['post_date'] = current_time( 'mysql' ); |
||
| 616 | $new_post['post_date_gmt'] = get_gmt_from_date( $new_post['post_date'] ); |
||
| 617 | $new_post['post_modified'] = $new_post['post_date']; |
||
| 618 | $new_post['post_modified_gmt'] = $new_post['post_date_gmt']; |
||
| 619 | |||
| 620 | switch( $post->post_type ) { |
||
| 621 | case 'course': $new_post['post_status'] = 'draft'; break; |
||
| 622 | case 'lesson': $new_post['post_status'] = 'draft'; break; |
||
| 623 | case 'quiz': $new_post['post_status'] = 'publish'; break; |
||
| 624 | case 'question': $new_post['post_status'] = 'publish'; break; |
||
| 625 | } |
||
| 626 | |||
| 627 | // As per wp_update_post() we need to escape the data from the db. |
||
| 628 | $new_post = wp_slash( $new_post ); |
||
| 629 | |||
| 630 | $new_post_id = wp_insert_post( $new_post ); |
||
| 631 | |||
| 632 | if( ! is_wp_error( $new_post_id ) ) { |
||
| 633 | |||
| 634 | $post_meta = get_post_custom( $post->ID ); |
||
| 635 | if( $post_meta && count( $post_meta ) > 0 ) { |
||
| 636 | |||
| 637 | $ignore_meta = array( '_quiz_lesson', '_quiz_id', '_lesson_quiz' ); |
||
| 638 | |||
| 639 | if( $ignore_course ) { |
||
| 640 | $ignore_meta[] = '_lesson_course'; |
||
| 641 | } |
||
| 642 | |||
| 643 | foreach( $post_meta as $key => $meta ) { |
||
| 644 | foreach( $meta as $value ) { |
||
| 645 | $value = maybe_unserialize( $value ); |
||
| 646 | if( ! in_array( $key, $ignore_meta ) ) { |
||
| 647 | add_post_meta( $new_post_id, $key, $value ); |
||
| 648 | } |
||
| 649 | } |
||
| 650 | } |
||
| 651 | } |
||
| 652 | |||
| 653 | add_post_meta( $new_post_id, '_duplicate', $post->ID ); |
||
| 654 | |||
| 655 | $taxonomies = get_object_taxonomies( $post->post_type, 'objects' ); |
||
| 656 | |||
| 657 | foreach ( $taxonomies as $slug => $tax ) { |
||
| 658 | $terms = get_the_terms( $post->ID, $slug ); |
||
| 659 | if( isset( $terms ) && is_array( $terms ) && 0 < count( $terms ) ) { |
||
| 660 | foreach( $terms as $term ) { |
||
| 661 | wp_set_object_terms( $new_post_id, $term->term_id, $slug, true ); |
||
| 662 | } |
||
| 663 | } |
||
| 664 | } |
||
| 665 | |||
| 666 | $new_post = get_post( $new_post_id ); |
||
| 667 | |||
| 668 | return $new_post; |
||
| 669 | } |
||
| 670 | |||
| 671 | return false; |
||
| 672 | } |
||
| 673 | |||
| 674 | /** |
||
| 675 | * Add options to filter lessons |
||
| 676 | * @return void |
||
| 677 | */ |
||
| 678 | public function lesson_filter_options() { |
||
| 679 | global $typenow; |
||
| 680 | |||
| 681 | if( is_admin() && 'lesson' == $typenow ) { |
||
| 682 | |||
| 683 | $args = array( |
||
| 684 | 'post_type' => 'course', |
||
| 685 | 'post_status' => array('publish', 'pending', 'draft', 'future', 'private'), |
||
| 686 | 'posts_per_page' => -1, |
||
| 687 | 'suppress_filters' => 0, |
||
| 688 | 'orderby' => 'menu_order date', |
||
| 689 | 'order' => 'ASC', |
||
| 690 | ); |
||
| 691 | $courses = get_posts( $args ); |
||
| 692 | |||
| 693 | $selected = isset( $_GET['lesson_course'] ) ? $_GET['lesson_course'] : ''; |
||
| 694 | $course_options = ''; |
||
| 695 | foreach( $courses as $course ) { |
||
| 696 | $course_options .= '<option value="' . esc_attr( $course->ID ) . '" ' . selected( $selected, $course->ID, false ) . '>' . get_the_title( $course->ID ) . '</option>'; |
||
| 697 | } |
||
| 698 | |||
| 699 | $output = '<select name="lesson_course" id="dropdown_lesson_course">'; |
||
| 700 | $output .= '<option value="">'.__( 'Show all courses', 'woothemes-sensei' ).'</option>'; |
||
| 701 | $output .= $course_options; |
||
| 702 | $output .= '</select>'; |
||
| 703 | |||
| 704 | echo $output; |
||
| 705 | } |
||
| 706 | } |
||
| 707 | |||
| 708 | /** |
||
| 709 | * Filter lessons |
||
| 710 | * @param array $request Current request |
||
| 711 | * @return array Modified request |
||
| 712 | */ |
||
| 713 | public function lesson_filter_actions( $request ) { |
||
| 714 | global $typenow; |
||
| 715 | |||
| 716 | if( is_admin() && 'lesson' == $typenow ) { |
||
| 717 | $lesson_course = isset( $_GET['lesson_course'] ) ? $_GET['lesson_course'] : ''; |
||
| 718 | |||
| 719 | if( $lesson_course ) { |
||
| 720 | $request['meta_key'] = '_lesson_course'; |
||
| 721 | $request['meta_value'] = $lesson_course; |
||
| 722 | $request['meta_compare'] = '='; |
||
| 723 | } |
||
| 724 | } |
||
| 725 | |||
| 726 | return $request; |
||
| 727 | } |
||
| 728 | |||
| 729 | /** |
||
| 730 | * Adding Sensei items to 'At a glance' dashboard widget |
||
| 731 | * @param array $items Existing items |
||
| 732 | * @return array Updated items |
||
| 733 | */ |
||
| 734 | public function glance_items( $items = array() ) { |
||
| 735 | |||
| 736 | $types = array( 'course', 'lesson', 'question' ); |
||
| 737 | |||
| 738 | foreach( $types as $type ) { |
||
| 739 | if( ! post_type_exists( $type ) ) continue; |
||
| 740 | |||
| 741 | $num_posts = wp_count_posts( $type ); |
||
| 742 | |||
| 743 | if( $num_posts ) { |
||
| 744 | |||
| 745 | $published = intval( $num_posts->publish ); |
||
| 746 | $post_type = get_post_type_object( $type ); |
||
| 747 | |||
| 748 | $text = _n( '%s ' . $post_type->labels->singular_name, '%s ' . $post_type->labels->name, $published, 'woothemes-sensei' ); |
||
| 749 | $text = sprintf( $text, number_format_i18n( $published ) ); |
||
| 750 | |||
| 751 | if ( current_user_can( $post_type->cap->edit_posts ) ) { |
||
| 752 | $items[] = sprintf( '<a class="%1$s-count" href="edit.php?post_type=%1$s">%2$s</a>', $type, $text ) . "\n"; |
||
| 753 | } else { |
||
| 754 | $items[] = sprintf( '<span class="%1$s-count">%2$s</span>', $type, $text ) . "\n"; |
||
| 755 | } |
||
| 756 | } |
||
| 757 | } |
||
| 758 | |||
| 759 | return $items; |
||
| 760 | } |
||
| 761 | |||
| 762 | /** |
||
| 763 | * Process lesson and course deletion |
||
| 764 | * @param integer $post_id Post ID |
||
| 765 | * @param object $post Post object |
||
| 766 | * @return void |
||
| 767 | */ |
||
| 768 | public function delete_content( $post_id, $post ) { |
||
| 769 | |||
| 770 | $type = $post->post_type; |
||
| 771 | |||
| 772 | if( in_array( $type, array( 'lesson', 'course' ) ) ) { |
||
| 773 | |||
| 774 | $meta_key = '_' . $type . '_prerequisite'; |
||
| 775 | |||
| 776 | $args = array( |
||
| 777 | 'post_type' => $type, |
||
| 778 | 'post_status' => 'any', |
||
| 779 | 'posts_per_page' => -1, |
||
| 780 | 'meta_key' => $meta_key, |
||
| 781 | 'meta_value' => $post_id |
||
| 782 | ); |
||
| 783 | |||
| 784 | $posts = get_posts( $args ); |
||
| 785 | |||
| 786 | foreach( $posts as $post ) { |
||
| 787 | delete_post_meta( $post->ID, $meta_key ); |
||
| 788 | } |
||
| 789 | } |
||
| 790 | } |
||
| 791 | |||
| 792 | /** |
||
| 793 | * Delete all user activity when user is deleted |
||
| 794 | * @param integer $user_id User ID |
||
| 795 | * @return void |
||
| 796 | */ |
||
| 797 | public function delete_user_activity( $user_id = 0 ) { |
||
| 798 | if( $user_id ) { |
||
| 799 | Sensei_Utils::delete_all_user_activity( $user_id ); |
||
| 800 | } |
||
| 801 | } |
||
| 802 | |||
| 803 | public function render_settings( $settings = array(), $post_id = 0, $group_id = '' ) { |
||
| 804 | |||
| 805 | $html = ''; |
||
| 806 | |||
| 807 | if( 0 == count( $settings ) ) return $html; |
||
| 808 | |||
| 809 | $html .= '<div class="sensei-options-panel">' . "\n"; |
||
| 810 | |||
| 811 | $html .= '<div class="options_group" id="' . esc_attr( $group_id ) . '">' . "\n"; |
||
| 812 | |||
| 813 | foreach( $settings as $field ) { |
||
| 814 | |||
| 815 | $data = ''; |
||
| 816 | |||
| 817 | if( $post_id ) { |
||
| 818 | $data = get_post_meta( $post_id, '_' . $field['id'], true ); |
||
| 819 | if( ! $data && isset( $field['default'] ) ) { |
||
| 820 | $data = $field['default']; |
||
| 821 | } |
||
| 822 | } else { |
||
| 823 | $option = get_option( $field['id'] ); |
||
| 824 | if( isset( $field['default'] ) ) { |
||
| 825 | $data = $field['default']; |
||
| 826 | if( $option ) { |
||
| 827 | $data = $option; |
||
| 828 | } |
||
| 829 | } |
||
| 830 | } |
||
| 831 | |||
| 832 | $disabled = ''; |
||
| 833 | if( isset( $field['disabled'] ) && $field['disabled'] ) { |
||
| 834 | $disabled = disabled( $field['disabled'], true, false ); |
||
| 835 | } |
||
| 836 | |||
| 837 | if( 'hidden' != $field['type'] ) { |
||
| 838 | |||
| 839 | $class_tail = ''; |
||
| 840 | |||
| 841 | if( isset( $field['class'] ) ) { |
||
| 842 | $class_tail .= $field['class']; |
||
| 843 | } |
||
| 844 | |||
| 845 | if( isset( $field['disabled'] ) && $field['disabled'] ) { |
||
| 846 | $class_tail .= ' disabled'; |
||
| 847 | } |
||
| 848 | |||
| 849 | $html .= '<p class="form-field ' . esc_attr( $field['id'] ) . ' ' . esc_attr( $class_tail ) . '">' . "\n"; |
||
| 850 | } |
||
| 851 | |||
| 852 | if( ! in_array( $field['type'], array( 'hidden', 'checkbox_multi', 'radio' ) ) ) { |
||
| 853 | $html .= '<label for="' . esc_attr( $field['id'] ) . '">' . "\n"; |
||
| 854 | } |
||
| 855 | |||
| 856 | if( $field['label'] ) { |
||
| 857 | $html .= '<span class="label">' . esc_html( $field['label'] ) . '</span>'; |
||
| 858 | } |
||
| 859 | |||
| 860 | switch( $field['type'] ) { |
||
| 861 | case 'text': |
||
| 862 | case 'password': |
||
| 863 | $html .= '<input id="' . esc_attr( $field['id'] ) . '" type="' . $field['type'] . '" name="' . esc_attr( $field['id'] ) . '" placeholder="' . esc_attr( $field['placeholder'] ) . '" value="' . $data . '" ' . $disabled . ' />' . "\n"; |
||
| 864 | break; |
||
| 865 | |||
| 866 | case 'number': |
||
| 867 | |||
| 868 | $min = ''; |
||
| 869 | View Code Duplication | if( isset( $field['min'] ) ) { |
|
| 870 | $min = 'min="' . esc_attr( $field['min'] ) . '"'; |
||
| 871 | } |
||
| 872 | |||
| 873 | $max = ''; |
||
| 874 | View Code Duplication | if( isset( $field['max'] ) ) { |
|
| 875 | $max = 'max="' . esc_attr( $field['max'] ) . '"'; |
||
| 876 | } |
||
| 877 | |||
| 878 | $html .= '<input id="' . esc_attr( $field['id'] ) . '" type="' . $field['type'] . '" name="' . esc_attr( $field['id'] ) . '" placeholder="' . esc_attr( $field['placeholder'] ) . '" value="' . $data . '" ' . $min . ' ' . $max . ' class="small-text" ' . $disabled . ' />' . "\n"; |
||
| 879 | break; |
||
| 880 | |||
| 881 | View Code Duplication | case 'textarea': |
|
| 882 | $html .= '<textarea id="' . esc_attr( $field['id'] ) . '" rows="5" cols="50" name="' . esc_attr( $field['id'] ) . '" placeholder="' . esc_attr( $field['placeholder'] ) . '" ' . $disabled . '>' . $data . '</textarea><br/>'. "\n"; |
||
| 883 | break; |
||
| 884 | |||
| 885 | case 'checkbox': |
||
| 886 | //backwards compatibility |
||
| 887 | if( empty( $data ) || 'on' == $data ){ |
||
| 888 | $checked_value = 'on'; |
||
| 889 | }elseif( 'yes' == $data ) { |
||
| 890 | |||
| 891 | $checked_value = 'yes'; |
||
| 892 | |||
| 893 | }elseif( 'auto' == $data ) { |
||
| 894 | |||
| 895 | $checked_value = 'auto'; |
||
| 896 | |||
| 897 | } else { |
||
| 898 | $checked_value = 1; |
||
| 899 | $data = intval( $data ); |
||
| 900 | } |
||
| 901 | $checked = checked( $checked_value, $data, false ); |
||
| 902 | $html .= '<input id="' . esc_attr( $field['id'] ) . '" type="' . $field['type'] . '" name="' . esc_attr( $field['id'] ) . '" ' . $checked . ' ' . $disabled . '/>' . "\n"; |
||
| 903 | break; |
||
| 904 | |||
| 905 | View Code Duplication | case 'checkbox_multi': |
|
| 906 | foreach( $field['options'] as $k => $v ) { |
||
| 907 | $checked = false; |
||
| 908 | if( in_array( $k, $data ) ) { |
||
| 909 | $checked = true; |
||
| 910 | } |
||
| 911 | $html .= '<label for="' . esc_attr( $field['id'] . '_' . $k ) . '"><input type="checkbox" ' . checked( $checked, true, false ) . ' name="' . esc_attr( $field['id'] ) . '[]" value="' . esc_attr( $k ) . '" id="' . esc_attr( $field['id'] . '_' . $k ) . '" ' . $disabled . ' /> ' . $v . '</label> ' . "\n"; |
||
| 912 | } |
||
| 913 | break; |
||
| 914 | |||
| 915 | View Code Duplication | case 'radio': |
|
| 916 | foreach( $field['options'] as $k => $v ) { |
||
| 917 | $checked = false; |
||
| 918 | if( $k == $data ) { |
||
| 919 | $checked = true; |
||
| 920 | } |
||
| 921 | $html .= '<label for="' . esc_attr( $field['id'] . '_' . $k ) . '"><input type="radio" ' . checked( $checked, true, false ) . ' name="' . esc_attr( $field['id'] ) . '" value="' . esc_attr( $k ) . '" id="' . esc_attr( $field['id'] . '_' . $k ) . '" ' . $disabled . ' /> ' . $v . '</label> ' . "\n"; |
||
| 922 | } |
||
| 923 | break; |
||
| 924 | |||
| 925 | View Code Duplication | case 'select': |
|
| 926 | $html .= '<select name="' . esc_attr( $field['id'] ) . '" id="' . esc_attr( $field['id'] ) . '" ' . $disabled . '>' . "\n"; |
||
| 927 | foreach( $field['options'] as $k => $v ) { |
||
| 928 | $selected = false; |
||
| 929 | if( $k == $data ) { |
||
| 930 | $selected = true; |
||
| 931 | } |
||
| 932 | $html .= '<option ' . selected( $selected, true, false ) . ' value="' . esc_attr( $k ) . '">' . $v . '</option>' . "\n"; |
||
| 933 | } |
||
| 934 | $html .= '</select><br/>' . "\n"; |
||
| 935 | break; |
||
| 936 | |||
| 937 | View Code Duplication | case 'select_multi': |
|
| 938 | $html .= '<select name="' . esc_attr( $field['id'] ) . '[]" id="' . esc_attr( $field['id'] ) . '" multiple="multiple" ' . $disabled . '>' . "\n"; |
||
| 939 | foreach( $field['options'] as $k => $v ) { |
||
| 940 | $selected = false; |
||
| 941 | if( in_array( $k, $data ) ) { |
||
| 942 | $selected = true; |
||
| 943 | } |
||
| 944 | $html .= '<option ' . selected( $selected, true, false ) . ' value="' . esc_attr( $k ) . '" />' . $v . '</option>' . "\n"; |
||
| 945 | } |
||
| 946 | $html .= '</select> . "\n"'; |
||
| 947 | break; |
||
| 948 | |||
| 949 | View Code Duplication | case 'hidden': |
|
| 950 | $html .= '<input id="' . esc_attr( $field['id'] ) . '" type="' . $field['type'] . '" name="' . esc_attr( $field['id'] ) . '" value="' . $data . '" ' . $disabled . '/>' . "\n"; |
||
| 951 | break; |
||
| 952 | |||
| 953 | } |
||
| 954 | |||
| 955 | if( $field['description'] ) { |
||
| 956 | $html .= ' <span class="description">' . esc_html( $field['description'] ) . '</span>' . "\n"; |
||
| 957 | } |
||
| 958 | |||
| 959 | if( ! in_array( $field['type'], array( 'hidden', 'checkbox_multi', 'radio' ) ) ) { |
||
| 960 | $html .= '</label>' . "\n"; |
||
| 961 | } |
||
| 962 | |||
| 963 | if( 'hidden' != $field['type'] ) { |
||
| 964 | $html .= '</p>' . "\n"; |
||
| 965 | } |
||
| 966 | |||
| 967 | } |
||
| 968 | |||
| 969 | $html .= '</div>' . "\n"; |
||
| 970 | |||
| 971 | $html .= '</div>' . "\n"; |
||
| 972 | |||
| 973 | return $html; |
||
| 974 | } |
||
| 975 | |||
| 976 | /** |
||
| 977 | * Dsplay Course Order screen |
||
| 978 | * @return void |
||
| 979 | */ |
||
| 980 | public function course_order_screen() { |
||
| 981 | |||
| 982 | $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; |
||
| 983 | wp_enqueue_script( 'woothemes-sensei-settings', esc_url( Sensei()->plugin_url . 'assets/js/settings' . $suffix . '.js' ), array( 'jquery', 'jquery-ui-sortable' ), Sensei()->version ); |
||
| 984 | |||
| 985 | ?><div id="course-order" class="wrap course-order"> |
||
| 986 | <h2><?php _e( 'Order Courses', 'woothemes-sensei' ); ?></h2><?php |
||
| 987 | |||
| 988 | $html = ''; |
||
| 989 | |||
| 990 | View Code Duplication | if( isset( $_POST['course-order'] ) && 0 < strlen( $_POST['course-order'] ) ) { |
|
| 991 | $ordered = $this->save_course_order( esc_attr( $_POST['course-order'] ) ); |
||
| 992 | |||
| 993 | if( $ordered ) { |
||
| 994 | $html .= '<div class="updated fade">' . "\n"; |
||
| 995 | $html .= '<p>' . __( 'The course order has been saved.', 'woothemes-sensei' ) . '</p>' . "\n"; |
||
| 996 | $html .= '</div>' . "\n"; |
||
| 997 | } |
||
| 998 | } |
||
| 999 | |||
| 1000 | $courses = Sensei()->course->get_all_courses(); |
||
| 1001 | |||
| 1002 | if( 0 < count( $courses ) ) { |
||
| 1003 | |||
| 1004 | // order the courses as set by the users |
||
| 1005 | $all_course_ids = array(); |
||
| 1006 | foreach( $courses as $course ){ |
||
| 1007 | |||
| 1008 | $all_course_ids[] = (string)$course->ID; |
||
| 1009 | |||
| 1010 | } |
||
| 1011 | $order_string = $this->get_course_order(); |
||
| 1012 | |||
| 1013 | if( !empty( $order_string ) ){ |
||
| 1014 | $ordered_course_ids = explode(',' , $order_string ); |
||
| 1015 | $all_course_ids = array_unique( array_merge( $ordered_course_ids , $all_course_ids ) ); |
||
| 1016 | } |
||
| 1017 | |||
| 1018 | |||
| 1019 | $html .= '<form id="editgrouping" method="post" action="" class="validate">' . "\n"; |
||
| 1020 | $html .= '<ul class="sortable-course-list">' . "\n"; |
||
| 1021 | $count = 0; |
||
| 1022 | foreach ( $all_course_ids as $course_id ) { |
||
| 1023 | $course = get_post( $course_id ); |
||
| 1024 | $count++; |
||
| 1025 | $class = 'course'; |
||
| 1026 | if ( $count == 1 ) { $class .= ' first'; } |
||
| 1027 | if ( $count == count( $course ) ) { $class .= ' last'; } |
||
| 1028 | if ( $count % 2 != 0 ) { |
||
| 1029 | $class .= ' alternate'; |
||
| 1030 | } |
||
| 1031 | $html .= '<li class="' . esc_attr( $class ) . '"><span rel="' . esc_attr( $course->ID ) . '" style="width: 100%;"> ' . $course->post_title . '</span></li>' . "\n"; |
||
| 1032 | } |
||
| 1033 | $html .= '</ul>' . "\n"; |
||
| 1034 | |||
| 1035 | $html .= '<input type="hidden" name="course-order" value="' . esc_attr( $order_string ) . '" />' . "\n"; |
||
| 1036 | $html .= '<input type="submit" class="button-primary" value="' . __( 'Save course order', 'woothemes-sensei' ) . '" />' . "\n"; |
||
| 1037 | } |
||
| 1038 | |||
| 1039 | echo $html; |
||
| 1040 | |||
| 1041 | ?></div><?php |
||
| 1042 | } |
||
| 1043 | |||
| 1044 | public function get_course_order() { |
||
| 1045 | return get_option( 'sensei_course_order', '' ); |
||
| 1046 | } |
||
| 1047 | |||
| 1048 | public function save_course_order( $order_string = '' ) { |
||
| 1049 | $order = explode( ',', $order_string ); |
||
| 1050 | |||
| 1051 | update_option( 'sensei_course_order', $order_string ); |
||
| 1052 | |||
| 1053 | $i = 1; |
||
| 1054 | foreach( $order as $course_id ) { |
||
| 1055 | |||
| 1056 | if( $course_id ) { |
||
| 1057 | |||
| 1058 | $update_args = array( |
||
| 1059 | 'ID' => $course_id, |
||
| 1060 | 'menu_order' => $i, |
||
| 1061 | ); |
||
| 1062 | |||
| 1063 | wp_update_post( $update_args ); |
||
| 1064 | |||
| 1065 | ++$i; |
||
| 1066 | } |
||
| 1067 | } |
||
| 1068 | |||
| 1069 | return true; |
||
| 1070 | } |
||
| 1071 | |||
| 1072 | /** |
||
| 1073 | * Dsplay Lesson Order screen |
||
| 1074 | * @return void |
||
| 1075 | */ |
||
| 1076 | public function lesson_order_screen() { |
||
| 1077 | |||
| 1078 | $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; |
||
| 1079 | wp_enqueue_script( 'woothemes-sensei-settings', esc_url( Sensei()->plugin_url . 'assets/js/settings' . $suffix . '.js' ), array( 'jquery', 'jquery-ui-sortable' ), Sensei()->version ); |
||
| 1080 | |||
| 1081 | ?><div id="lesson-order" class="wrap lesson-order"> |
||
| 1082 | <h2><?php _e( 'Order Lessons', 'woothemes-sensei' ); ?></h2><?php |
||
| 1083 | |||
| 1084 | $html = ''; |
||
| 1085 | |||
| 1086 | View Code Duplication | if( isset( $_POST['lesson-order'] ) ) { |
|
| 1087 | |||
| 1088 | $ordered = $this->save_lesson_order( esc_attr( $_POST['lesson-order'] ), esc_attr( $_POST['course_id'] ) ); |
||
| 1089 | |||
| 1090 | if( $ordered ) { |
||
| 1091 | $html .= '<div class="updated fade">' . "\n"; |
||
| 1092 | $html .= '<p>' . __( 'The lesson order has been saved.', 'woothemes-sensei' ) . '</p>' . "\n"; |
||
| 1093 | $html .= '</div>' . "\n"; |
||
| 1094 | } |
||
| 1095 | } |
||
| 1096 | |||
| 1097 | $args = array( |
||
| 1098 | 'post_type' => 'course', |
||
| 1099 | 'post_status' => array('publish', 'draft', 'future', 'private'), |
||
| 1100 | 'posts_per_page' => -1, |
||
| 1101 | 'orderby' => 'name', |
||
| 1102 | 'order' => 'ASC', |
||
| 1103 | ); |
||
| 1104 | $courses = get_posts( $args ); |
||
| 1105 | |||
| 1106 | $html .= '<form action="' . admin_url( 'edit.php' ) . '" method="get">' . "\n"; |
||
| 1107 | $html .= '<input type="hidden" name="post_type" value="lesson" />' . "\n"; |
||
| 1108 | $html .= '<input type="hidden" name="page" value="lesson-order" />' . "\n"; |
||
| 1109 | $html .= '<select id="lesson-order-course" name="course_id">' . "\n"; |
||
| 1110 | $html .= '<option value="">' . __( 'Select a course', 'woothemes-sensei' ) . '</option>' . "\n"; |
||
| 1111 | |||
| 1112 | foreach( $courses as $course ) { |
||
| 1113 | $course_id = ''; |
||
| 1114 | if( isset( $_GET['course_id'] ) ) { |
||
| 1115 | $course_id = intval( $_GET['course_id'] ); |
||
| 1116 | } |
||
| 1117 | $html .= '<option value="' . esc_attr( intval( $course->ID ) ) . '" ' . selected( $course->ID, $course_id, false ) .'>' . get_the_title( $course->ID ) . '</option>' . "\n"; |
||
| 1118 | } |
||
| 1119 | |||
| 1120 | $html .= '</select>' . "\n"; |
||
| 1121 | $html .= '<input type="submit" class="button-primary lesson-order-select-course-submit" value="' . __( 'Select', 'woothemes-sensei' ) . '" />' . "\n"; |
||
| 1122 | $html .= '</form>' . "\n"; |
||
| 1123 | |||
| 1124 | $html .= '<script type="text/javascript">' . "\n"; |
||
| 1125 | $html .= 'jQuery( \'#lesson-order-course\' ).select2({width:"resolve"});' . "\n"; |
||
| 1126 | $html .= '</script>' . "\n"; |
||
| 1127 | |||
| 1128 | if( isset( $_GET['course_id'] ) ) { |
||
| 1129 | $course_id = intval( $_GET['course_id'] ); |
||
| 1130 | if( $course_id > 0 ) { |
||
| 1131 | |||
| 1132 | $order_string = $this->get_lesson_order( $course_id ); |
||
| 1133 | |||
| 1134 | $html .= '<form id="editgrouping" method="post" action="" class="validate">' . "\n"; |
||
| 1135 | |||
| 1136 | $displayed_lessons = array(); |
||
| 1137 | |||
| 1138 | $modules = Sensei()->modules->get_course_modules( intval( $course_id ) ); |
||
| 1139 | |||
| 1140 | foreach( $modules as $module ) { |
||
| 1141 | |||
| 1142 | $args = array( |
||
| 1143 | 'post_type' => 'lesson', |
||
| 1144 | 'post_status' => 'publish', |
||
| 1145 | 'posts_per_page' => -1, |
||
| 1146 | 'meta_query' => array( |
||
| 1147 | array( |
||
| 1148 | 'key' => '_lesson_course', |
||
| 1149 | 'value' => intval( $course_id ), |
||
| 1150 | 'compare' => '=' |
||
| 1151 | ) |
||
| 1152 | ), |
||
| 1153 | 'tax_query' => array( |
||
| 1154 | array( |
||
| 1155 | 'taxonomy' => Sensei()->modules->taxonomy, |
||
| 1156 | 'field' => 'id', |
||
| 1157 | 'terms' => intval( $module->term_id ) |
||
| 1158 | ) |
||
| 1159 | ), |
||
| 1160 | 'meta_key' => '_order_module_' . $module->term_id, |
||
| 1161 | 'orderby' => 'meta_value_num date', |
||
| 1162 | 'order' => 'ASC', |
||
| 1163 | 'suppress_filters' => 0 |
||
| 1164 | ); |
||
| 1165 | |||
| 1166 | $lessons = get_posts( $args ); |
||
| 1167 | |||
| 1168 | if( count( $lessons ) > 0 ) { |
||
| 1169 | $html .= '<h3>' . $module->name . '</h3>' . "\n"; |
||
| 1170 | $html .= '<ul class="sortable-lesson-list" data-module_id="' . $module->term_id . '">' . "\n"; |
||
| 1171 | |||
| 1172 | $count = 0; |
||
| 1173 | View Code Duplication | foreach( $lessons as $lesson ) { |
|
| 1174 | $count++; |
||
| 1175 | $class = 'lesson'; |
||
| 1176 | if ( $count == 1 ) { $class .= ' first'; } |
||
| 1177 | if ( $count == count( $lesson ) ) { $class .= ' last'; } |
||
| 1178 | if ( $count % 2 != 0 ) { |
||
| 1179 | $class .= ' alternate'; |
||
| 1180 | } |
||
| 1181 | |||
| 1182 | $html .= '<li class="' . esc_attr( $class ) . '"><span rel="' . esc_attr( $lesson->ID ) . '" style="width: 100%;"> ' . $lesson->post_title . '</span></li>' . "\n"; |
||
| 1183 | |||
| 1184 | $displayed_lessons[] = $lesson->ID; |
||
| 1185 | } |
||
| 1186 | |||
| 1187 | $html .= '</ul>' . "\n"; |
||
| 1188 | |||
| 1189 | $html .= '<input type="hidden" name="lesson-order-module-' . $module->term_id . '" value="" />' . "\n"; |
||
| 1190 | } |
||
| 1191 | } |
||
| 1192 | |||
| 1193 | |||
| 1194 | $lessons = Sensei()->course->course_lessons( $course_id ); |
||
| 1195 | |||
| 1196 | if( 0 < count( $lessons ) ) { |
||
| 1197 | |||
| 1198 | //get module term ids, will be used to exclude lessons |
||
| 1199 | $module_items_ids = array(); |
||
| 1200 | if( ! empty( $modules ) ) { |
||
| 1201 | foreach ($modules as $module) { |
||
| 1202 | $module_items_ids[] = $module->term_id; |
||
| 1203 | } |
||
| 1204 | } |
||
| 1205 | |||
| 1206 | View Code Duplication | if( 0 < count( $displayed_lessons ) ) { |
|
| 1207 | $html .= '<h3>' . __( 'Other Lessons', 'woothemes-sensei' ) . '</h3>' . "\n"; |
||
| 1208 | } |
||
| 1209 | |||
| 1210 | $html .= '<ul class="sortable-lesson-list" data-module_id="0">' . "\n"; |
||
| 1211 | $count = 0; |
||
| 1212 | foreach ( $lessons as $lesson ) { |
||
| 1213 | |||
| 1214 | // if lesson belongs to one fo the course modules then exclude it here |
||
| 1215 | // as it is listed above |
||
| 1216 | if( has_term( $module_items_ids, 'module', $lesson->ID ) ){ |
||
| 1217 | |||
| 1218 | continue; |
||
| 1219 | |||
| 1220 | } |
||
| 1221 | |||
| 1222 | $count++; |
||
| 1223 | $class = 'lesson'; |
||
| 1224 | if ( $count == 1 ) { $class .= ' first'; } |
||
| 1225 | if ( $count == count( $lesson ) ) { $class .= ' last'; } |
||
| 1226 | if ( $count % 2 != 0 ) { |
||
| 1227 | |||
| 1228 | $class .= ' alternate'; |
||
| 1229 | |||
| 1230 | } |
||
| 1231 | $html .= '<li class="' . esc_attr( $class ) . '"><span rel="' . esc_attr( $lesson->ID ) . '" style="width: 100%;"> ' . $lesson->post_title . '</span></li>' . "\n"; |
||
| 1232 | |||
| 1233 | $displayed_lessons[] = $lesson->ID; |
||
| 1234 | } |
||
| 1235 | $html .= '</ul>' . "\n"; |
||
| 1236 | View Code Duplication | } else { |
|
| 1237 | if( 0 == count( $displayed_lessons ) ) { |
||
| 1238 | $html .= '<p><em>' . __( 'There are no lessons in this course.', 'woothemes-sensei' ) . '</em></p>'; |
||
| 1239 | } |
||
| 1240 | } |
||
| 1241 | |||
| 1242 | if( 0 < count( $displayed_lessons ) ) { |
||
| 1243 | $html .= '<input type="hidden" name="lesson-order" value="' . esc_attr( $order_string ) . '" />' . "\n"; |
||
| 1244 | $html .= '<input type="hidden" name="course_id" value="' . $course_id . '" />' . "\n"; |
||
| 1245 | $html .= '<input type="submit" class="button-primary" value="' . __( 'Save lesson order', 'woothemes-sensei' ) . '" />' . "\n"; |
||
| 1246 | } |
||
| 1247 | } |
||
| 1248 | } |
||
| 1249 | |||
| 1250 | echo $html; |
||
| 1251 | |||
| 1252 | ?></div><?php |
||
| 1253 | } |
||
| 1254 | |||
| 1255 | public function get_lesson_order( $course_id = 0 ) { |
||
| 1256 | $order_string = get_post_meta( $course_id, '_lesson_order', true ); |
||
| 1257 | return $order_string; |
||
| 1258 | } |
||
| 1259 | |||
| 1260 | public function save_lesson_order( $order_string = '', $course_id = 0 ) { |
||
| 1261 | |||
| 1262 | if( $course_id ) { |
||
| 1263 | |||
| 1264 | $modules = Sensei()->modules->get_course_modules( intval( $course_id ) ); |
||
| 1265 | |||
| 1266 | foreach( $modules as $module ) { |
||
| 1267 | |||
| 1268 | |||
| 1269 | if( isset( $_POST[ 'lesson-order-module-' . $module->term_id ] ) |
||
| 1270 | && $_POST[ 'lesson-order-module-' . $module->term_id ] ) { |
||
| 1271 | |||
| 1272 | $order = explode( ',', $_POST[ 'lesson-order-module-' . $module->term_id ] ); |
||
| 1273 | $i = 1; |
||
| 1274 | foreach( $order as $lesson_id ) { |
||
| 1275 | |||
| 1276 | if( $lesson_id ) { |
||
| 1277 | update_post_meta( $lesson_id, '_order_module_' . $module->term_id, $i ); |
||
| 1278 | ++$i; |
||
| 1279 | } |
||
| 1280 | |||
| 1281 | }// end for each order |
||
| 1282 | |||
| 1283 | }// end if |
||
| 1284 | |||
| 1285 | } // end for each modules |
||
| 1286 | |||
| 1287 | |||
| 1288 | if( $order_string ) { |
||
| 1289 | update_post_meta( $course_id, '_lesson_order', $order_string ); |
||
| 1290 | |||
| 1291 | $order = explode( ',', $order_string ); |
||
| 1292 | |||
| 1293 | $i = 1; |
||
| 1294 | foreach( $order as $lesson_id ) { |
||
| 1295 | if( $lesson_id ) { |
||
| 1296 | update_post_meta( $lesson_id, '_order_' . $course_id, $i ); |
||
| 1297 | ++$i; |
||
| 1298 | } |
||
| 1299 | } |
||
| 1300 | } |
||
| 1301 | |||
| 1302 | return true; |
||
| 1303 | } |
||
| 1304 | |||
| 1305 | return false; |
||
| 1306 | } |
||
| 1307 | |||
| 1308 | function sensei_add_custom_menu_items() { |
||
|
0 ignored issues
–
show
|
|||
| 1309 | global $pagenow; |
||
| 1310 | |||
| 1311 | if( 'nav-menus.php' == $pagenow ) { |
||
| 1312 | add_meta_box( 'add-sensei-links', 'Sensei', array( $this, 'wp_nav_menu_item_sensei_links_meta_box' ), 'nav-menus', 'side', 'low' ); |
||
| 1313 | } |
||
| 1314 | } |
||
| 1315 | |||
| 1316 | function wp_nav_menu_item_sensei_links_meta_box( $object ) { |
||
|
0 ignored issues
–
show
|
|||
| 1317 | global $nav_menu_selected_id; |
||
| 1318 | |||
| 1319 | $menu_items = array( |
||
| 1320 | '#senseicourses' => __( 'Courses', 'woothemes-sensei' ), |
||
| 1321 | '#senseilessons' => __( 'Lessons', 'woothemes-sensei' ), |
||
| 1322 | '#senseimycourses' => __( 'My Courses', 'woothemes-sensei' ), |
||
| 1323 | '#senseilearnerprofile' => __( 'My Profile', 'woothemes-sensei' ), |
||
| 1324 | '#senseimymessages' => __( 'My Messages', 'woothemes-sensei' ), |
||
| 1325 | '#senseiloginlogout' => __( 'Login', 'woothemes-sensei' ) . '|' . __( 'Logout', 'woothemes-sensei' ) |
||
| 1326 | ); |
||
| 1327 | |||
| 1328 | $menu_items_obj = array(); |
||
| 1329 | foreach ( $menu_items as $value => $title ) { |
||
| 1330 | $menu_items_obj[$title] = new stdClass; |
||
| 1331 | $menu_items_obj[$title]->object_id = esc_attr( $value ); |
||
| 1332 | $menu_items_obj[$title]->title = esc_attr( $title ); |
||
| 1333 | $menu_items_obj[$title]->url = esc_attr( $value ); |
||
| 1334 | $menu_items_obj[$title]->description = 'description'; |
||
| 1335 | $menu_items_obj[$title]->db_id = 0; |
||
| 1336 | $menu_items_obj[$title]->object = 'sensei'; |
||
| 1337 | $menu_items_obj[$title]->menu_item_parent = 0; |
||
| 1338 | $menu_items_obj[$title]->type = 'custom'; |
||
| 1339 | $menu_items_obj[$title]->target = ''; |
||
| 1340 | $menu_items_obj[$title]->attr_title = ''; |
||
| 1341 | $menu_items_obj[$title]->classes = array(); |
||
| 1342 | $menu_items_obj[$title]->xfn = ''; |
||
| 1343 | } |
||
| 1344 | |||
| 1345 | $walker = new Walker_Nav_Menu_Checklist( array() ); |
||
| 1346 | ?> |
||
| 1347 | |||
| 1348 | <div id="sensei-links" class="senseidiv taxonomydiv"> |
||
| 1349 | <div id="tabs-panel-sensei-links-all" class="tabs-panel tabs-panel-view-all tabs-panel-active"> |
||
| 1350 | |||
| 1351 | <ul id="sensei-linkschecklist" class="list:sensei-links categorychecklist form-no-clear"> |
||
| 1352 | <?php echo walk_nav_menu_tree( array_map( 'wp_setup_nav_menu_item', $menu_items_obj ), 0, (object)array( 'walker' => $walker ) ); ?> |
||
| 1353 | </ul> |
||
| 1354 | |||
| 1355 | </div> |
||
| 1356 | <p class="button-controls"> |
||
| 1357 | <span class="add-to-menu"> |
||
| 1358 | <input type="submit"<?php disabled( $nav_menu_selected_id, 0 ); ?> class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e( 'Add to Menu', 'woothemes-sensei' ); ?>" name="add-sensei-links-menu-item" id="submit-sensei-links" /> |
||
| 1359 | <span class="spinner"></span> |
||
| 1360 | </span> |
||
| 1361 | </p> |
||
| 1362 | </div><!-- .senseidiv --> |
||
| 1363 | <?php |
||
| 1364 | } |
||
| 1365 | |||
| 1366 | /** |
||
| 1367 | * Adding admin notice if the current |
||
| 1368 | * installed theme is not compatible |
||
| 1369 | * |
||
| 1370 | * @return void |
||
| 1371 | */ |
||
| 1372 | public function theme_compatibility_notices() { |
||
| 1373 | |||
| 1374 | if( isset( $_GET['sensei_hide_notice'] ) ) { |
||
| 1375 | switch( esc_attr( $_GET['sensei_hide_notice'] ) ) { |
||
| 1376 | case 'menu_settings': add_user_meta( get_current_user_id(), 'sensei_hide_menu_settings_notice', true ); break; |
||
| 1377 | case 'theme_check': add_user_meta( get_current_user_id(), 'sensei_hide_theme_check_notice', true ); break; |
||
| 1378 | } |
||
| 1379 | } |
||
| 1380 | |||
| 1381 | // white list templates that are already support by default and do not show notice for them |
||
| 1382 | $template = get_option( 'template' ); |
||
| 1383 | |||
| 1384 | $white_list = array( 'twentyeleven', |
||
| 1385 | 'twentytwelve', |
||
| 1386 | 'twentyfourteen', |
||
| 1387 | 'twentyfifteen', |
||
| 1388 | 'twentysixteen', |
||
| 1389 | 'storefront', |
||
| 1390 | ); |
||
| 1391 | |||
| 1392 | if ( in_array( $template, $white_list ) ) { |
||
| 1393 | |||
| 1394 | return; |
||
| 1395 | |||
| 1396 | } |
||
| 1397 | |||
| 1398 | // don't show the notice if the user chose to hide it |
||
| 1399 | $hide_theme_check_notice = get_user_meta( get_current_user_id(), 'sensei_hide_theme_check_notice', true ); |
||
| 1400 | if( $hide_theme_check_notice ) { |
||
| 1401 | |||
| 1402 | return; |
||
| 1403 | |||
| 1404 | } |
||
| 1405 | |||
| 1406 | // show the notice for themes not supporting sensei |
||
| 1407 | if ( ! current_theme_supports( 'sensei' ) ) { |
||
| 1408 | ?> |
||
| 1409 | |||
| 1410 | <div id="message" class="error sensei-message sensei-connect"> |
||
| 1411 | <p> |
||
| 1412 | <strong> |
||
| 1413 | |||
| 1414 | <?php _e('Your theme does not declare Sensei support', 'woothemes-sensei' ); ?> |
||
| 1415 | |||
| 1416 | </strong> – |
||
| 1417 | |||
| 1418 | <?php _e( 'if you encounter layout issues please read our integration guide or choose a ', 'woothemes-sensei' ); ?> |
||
| 1419 | |||
| 1420 | <a href="http://www.woothemes.com/product-category/themes/sensei-themes/"> <?php _e( 'Sensei theme', 'woothemes-sensei' ) ?> </a> |
||
| 1421 | |||
| 1422 | :) |
||
| 1423 | |||
| 1424 | </p> |
||
| 1425 | <p class="submit"> |
||
| 1426 | <a href="<?php echo esc_url( apply_filters( 'sensei_docs_url', 'http://docs.woothemes.com/document/sensei-and-theme-compatibility/', 'theme-compatibility' ) ); ?>" class="button-primary"> |
||
| 1427 | |||
| 1428 | <?php _e( 'Theme Integration Guide', 'woothemes-sensei' ); ?></a> <a class="skip button" href="<?php echo esc_url( add_query_arg( 'sensei_hide_notice', 'theme_check' ) ); ?>"><?php _e( 'Hide this notice', 'woothemes-sensei' ); ?> |
||
| 1429 | |||
| 1430 | </a> |
||
| 1431 | </p> |
||
| 1432 | </div> |
||
| 1433 | <?php |
||
| 1434 | } |
||
| 1435 | } |
||
| 1436 | |||
| 1437 | /** |
||
| 1438 | * Reset theme check notice |
||
| 1439 | * @return void |
||
| 1440 | */ |
||
| 1441 | public function reset_theme_check_notices() { |
||
| 1442 | global $current_user; |
||
| 1443 | wp_get_current_user(); |
||
| 1444 | $user_id = $current_user->ID; |
||
| 1445 | |||
| 1446 | delete_user_meta( $user_id, 'sensei_hide_theme_check_notice' ); |
||
| 1447 | } |
||
| 1448 | |||
| 1449 | /** |
||
| 1450 | * Set Sensei users access to the admin area when WooCommerce is installed |
||
| 1451 | * Allow Teachers to access the admin area |
||
| 1452 | * |
||
| 1453 | * @param bool $prevent_access |
||
| 1454 | * @return bool |
||
| 1455 | */ |
||
| 1456 | public function admin_access( $prevent_access ) { |
||
| 1457 | if ( current_user_can( 'manage_sensei_grades' ) ) { |
||
| 1458 | return false; |
||
| 1459 | } |
||
| 1460 | |||
| 1461 | return $prevent_access; |
||
| 1462 | } |
||
| 1463 | |||
| 1464 | /** |
||
| 1465 | * Hooked onto admin_init. Listens for install_sensei_pages and skip_install_sensei_pages query args |
||
| 1466 | * on the sensei settings page. |
||
| 1467 | * |
||
| 1468 | * The function |
||
| 1469 | * |
||
| 1470 | * @since 1.8.7 |
||
| 1471 | */ |
||
| 1472 | public static function install_pages(){ |
||
| 1473 | |||
| 1474 | // only fire on the settings page |
||
| 1475 | if( ! isset( $_GET['page'] ) |
||
| 1476 | || 'woothemes-sensei-settings' != $_GET['page'] |
||
| 1477 | || 1 == get_option('skip_install_sensei_pages') ){ |
||
| 1478 | |||
| 1479 | return; |
||
| 1480 | |||
| 1481 | } |
||
| 1482 | |||
| 1483 | // Install/page installer |
||
| 1484 | $install_complete = false; |
||
| 1485 | |||
| 1486 | // Add pages button |
||
| 1487 | $settings_url = ''; |
||
| 1488 | if (isset($_GET['install_sensei_pages']) && $_GET['install_sensei_pages']) { |
||
| 1489 | |||
| 1490 | Sensei()->admin->create_pages(); |
||
| 1491 | |||
| 1492 | update_option('skip_install_sensei_pages', 1); |
||
| 1493 | |||
| 1494 | $install_complete = true; |
||
| 1495 | $settings_url = remove_query_arg('install_sensei_pages'); |
||
| 1496 | |||
| 1497 | // Skip button |
||
| 1498 | } elseif (isset($_GET['skip_install_sensei_pages']) && $_GET['skip_install_sensei_pages']) { |
||
| 1499 | |||
| 1500 | update_option('skip_install_sensei_pages', 1); |
||
| 1501 | $install_complete = true; |
||
| 1502 | $settings_url = remove_query_arg('skip_install_sensei_pages'); |
||
| 1503 | |||
| 1504 | } |
||
| 1505 | |||
| 1506 | if ($install_complete) { |
||
| 1507 | |||
| 1508 | // refresh the rewrite rules on init |
||
| 1509 | update_option('sensei_flush_rewrite_rules', '1'); |
||
| 1510 | |||
| 1511 | // Set installed option |
||
| 1512 | update_option('sensei_installed', 0); |
||
| 1513 | |||
| 1514 | $complete_url = add_query_arg( 'sensei_install_complete', 'true', $settings_url ); |
||
| 1515 | wp_redirect( $complete_url ); |
||
| 1516 | |||
| 1517 | } |
||
| 1518 | |||
| 1519 | }// end install_pages |
||
| 1520 | |||
| 1521 | } // End Class |
||
| 1522 | |||
| 1523 | /** |
||
| 1524 | * Legacy Class WooThemes_Sensei_Admin |
||
| 1525 | * @ignore only for backward compatibility |
||
| 1526 | * @since 1.9.0 |
||
| 1527 | * @ignore |
||
| 1528 | */ |
||
| 1529 | class WooThemes_Sensei_Admin extends Sensei_Admin{ } |
||
| 1530 |
Adding explicit visibility (
private,protected, orpublic) is generally recommend to communicate to other developers how, and from where this method is intended to be used.