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 | * Sensei Frontend Class |
||
6 | * |
||
7 | * All functionality pertaining to the frontend of Sensei. |
||
8 | * |
||
9 | * @package Core |
||
10 | * @author Automattic |
||
11 | * |
||
12 | * @since 1.0.0 |
||
13 | */ |
||
14 | class Sensei_Frontend { |
||
15 | |||
16 | public $messages; |
||
17 | public $data; |
||
18 | |||
19 | /** |
||
20 | * Constructor. |
||
21 | * @since 1.0.0 |
||
22 | */ |
||
23 | public function __construct () { |
||
24 | |||
25 | // Template output actions |
||
26 | add_action( 'sensei_before_main_content', array( $this, 'sensei_output_content_wrapper' ), 10 ); |
||
27 | add_action( 'sensei_after_main_content', array( $this, 'sensei_output_content_wrapper_end' ), 10 ); |
||
28 | add_action( 'sensei_lesson_archive_lesson_title', array( $this, 'sensei_lesson_archive_lesson_title' ), 10 ); |
||
29 | |||
30 | // 1.2.1 |
||
31 | add_action( 'wp_head', array( $this, 'sensei_complete_lesson' ), 10 ); |
||
32 | add_action( 'wp_head', array( $this, 'sensei_complete_course' ), 10 ); |
||
33 | add_action( 'sensei_frontend_messages', array( $this, 'sensei_frontend_messages' ) ); |
||
34 | add_action( 'sensei_lesson_video', array( $this, 'sensei_lesson_video' ), 10, 1 ); |
||
35 | add_action( 'sensei_complete_lesson_button', array( $this, 'sensei_complete_lesson_button' ) ); |
||
36 | add_action( 'sensei_reset_lesson_button', array( $this, 'sensei_reset_lesson_button' ) ); |
||
37 | |||
38 | add_action( 'sensei_course_archive_meta', array( $this, 'sensei_course_archive_meta' ) ); |
||
39 | |||
40 | add_action( 'sensei_lesson_tag_main_content', array( $this, 'sensei_lesson_archive_main_content' ), 10 ); |
||
41 | add_action( 'sensei_no_permissions_main_content', array( $this, 'sensei_no_permissions_main_content' ), 10 ); |
||
42 | |||
43 | add_action( 'sensei_lesson_meta', array( $this, 'sensei_lesson_meta' ), 10 ); |
||
44 | add_action( 'sensei_single_course_content_inside_before', array( $this, 'sensei_course_start' ), 10 ); |
||
45 | |||
46 | // add_filter( 'get_comments_number', array( $this, 'sensei_lesson_comment_count' ), 1 ); |
||
47 | add_filter( 'the_title', array( $this, 'sensei_lesson_preview_title' ), 10, 2 ); |
||
48 | |||
49 | //1.6.2 |
||
50 | add_filter( 'wp_login_failed', array( $this, 'sensei_login_fail_redirect' ), 10 ); |
||
51 | add_filter( 'init', array( $this, 'sensei_handle_login_request' ), 10 ); |
||
52 | //1.6.3 |
||
53 | add_action( 'init', array( $this, 'sensei_process_registration' ), 2 ); |
||
54 | //1.7.0 |
||
55 | add_action( 'sensei_pagination', array( $this, 'sensei_breadcrumb' ), 80, 1 ); |
||
56 | |||
57 | // Fix pagination for course archive pages when filtering by course type |
||
58 | add_filter( 'pre_get_posts', array( $this, 'sensei_course_archive_pagination' ) ); |
||
59 | |||
60 | // Scripts and Styles |
||
61 | add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_styles' ) ); |
||
62 | add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); |
||
63 | |||
64 | // Custom Menu Item filters |
||
65 | add_filter( 'wp_setup_nav_menu_item', array( $this, 'sensei_setup_nav_menu_item' ) ); |
||
66 | add_filter( 'wp_nav_menu_objects', array( $this, 'sensei_wp_nav_menu_objects' ) ); |
||
67 | // Search Results filters |
||
68 | add_filter( 'post_class', array( $this, 'sensei_search_results_classes' ), 10 ); |
||
69 | // Only show course & lesson excerpts in search results |
||
70 | add_filter( 'the_content', array( $this, 'sensei_search_results_excerpt' ) ); |
||
71 | |||
72 | //Use WooCommerce filter to show admin bar to Teachers. |
||
73 | add_action( 'init', array( $this, 'sensei_show_admin_bar') ); |
||
74 | |||
75 | // Remove course from active courses if an order is cancelled or refunded |
||
76 | add_action( 'woocommerce_order_status_processing_to_cancelled', array( $this, 'remove_active_course' ), 10, 1 ); |
||
77 | add_action( 'woocommerce_order_status_completed_to_cancelled', array( $this, 'remove_active_course' ), 10, 1 ); |
||
78 | add_action( 'woocommerce_order_status_on-hold_to_cancelled', array( $this, 'remove_active_course' ), 10, 1 ); |
||
79 | add_action( 'woocommerce_order_status_processing_to_refunded', array( $this, 'remove_active_course' ), 10, 1 ); |
||
80 | add_action( 'woocommerce_order_status_completed_to_refunded', array( $this, 'remove_active_course' ), 10, 1 ); |
||
81 | add_action( 'woocommerce_order_status_on-hold_to_refunded', array( $this, 'remove_active_course' ), 10, 1 ); |
||
82 | |||
83 | // Make sure correct courses are marked as active for users |
||
84 | add_action( 'sensei_before_my_courses', array( $this, 'activate_purchased_courses' ), 10, 1 ); |
||
85 | add_action( 'sensei_single_course_content_inside_before', array( $this, 'activate_purchased_single_course' ), 10 ); |
||
86 | |||
87 | // Lesson tags |
||
88 | add_action( 'sensei_lesson_meta_extra', array( $this, 'lesson_tags_display' ), 10, 1 ); |
||
89 | add_action( 'pre_get_posts', array( $this, 'lesson_tag_archive_filter' ), 10, 1 ); |
||
90 | add_filter( 'sensei_lessons_archive_text', array( $this, 'lesson_tag_archive_header' ) ); |
||
91 | add_action( 'sensei_loop_lesson_inside_before', array( $this, 'lesson_tag_archive_description' ), 11 ); |
||
92 | |||
93 | // Hide Sensei activity comments from lesson and course pages |
||
94 | add_filter( 'wp_list_comments_args', array( $this, 'hide_sensei_activity' ) ); |
||
95 | } // End __construct() |
||
96 | |||
97 | /** |
||
98 | * Graceful fallback for course and lesson variables on Frontend object |
||
99 | * |
||
100 | * @param string $key Key to get. |
||
101 | * @since 1.7.3 |
||
102 | * @return array|mixed |
||
103 | */ |
||
104 | public function __get( $key ) { |
||
105 | |||
106 | if ( 'lesson' == $key || 'course' == $key ) { |
||
107 | if ( WP_DEBUG ) { |
||
108 | trigger_error( sprintf( 'Sensei()->frontend->%1$s has been <strong>deprecated</strong> since version %2$s! Please use Sensei()->%1$s to access the instance.', $key, '1.7.3' ) ); |
||
109 | } |
||
110 | return Sensei()->$key; |
||
111 | } |
||
112 | |||
113 | return null; |
||
114 | } |
||
115 | |||
116 | /** |
||
117 | * Enqueue frontend JavaScripts. |
||
118 | * @since 1.0.0 |
||
119 | * @return void |
||
120 | */ |
||
121 | public function enqueue_scripts () { |
||
122 | |||
123 | $disable_js = false; |
||
124 | if ( isset( Sensei()->settings->settings[ 'js_disable' ] ) ) { |
||
125 | $disable_js = Sensei()->settings->settings[ 'js_disable' ]; |
||
126 | } // End If Statement |
||
127 | if ( ! $disable_js ) { |
||
128 | |||
129 | $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; |
||
130 | |||
131 | // My Courses tabs script |
||
132 | wp_register_script( Sensei()->token . '-user-dashboard', esc_url( Sensei()->plugin_url . 'assets/js/user-dashboard' . $suffix . '.js' ), array( 'jquery-ui-tabs' ), Sensei()->version, true ); |
||
133 | wp_enqueue_script( Sensei()->token . '-user-dashboard' ); |
||
134 | |||
135 | |||
136 | // Course Archive javascript |
||
137 | if( is_post_type_archive( 'course' ) ){ |
||
138 | |||
139 | wp_register_script( 'sensei-course-archive-js', esc_url( Sensei()->plugin_url . 'assets/js/frontend/course-archive' . $suffix . '.js' ), array( 'jquery' ), '1', true ); |
||
140 | wp_enqueue_script( 'sensei-course-archive-js' ); |
||
141 | |||
142 | } |
||
143 | |||
144 | |||
145 | // Allow additional scripts to be loaded |
||
146 | do_action( 'sensei_additional_scripts' ); |
||
147 | |||
148 | } // End If Statement |
||
149 | |||
150 | } // End enqueue_scripts() |
||
151 | |||
152 | /** |
||
153 | * Enqueue frontend CSS files. |
||
154 | * @since 1.0.0 |
||
155 | * @return void |
||
156 | */ |
||
157 | public function enqueue_styles () { |
||
158 | |||
159 | $disable_styles = false; |
||
160 | if ( isset( Sensei()->settings->settings[ 'styles_disable' ] ) ) { |
||
161 | $disable_styles = Sensei()->settings->settings[ 'styles_disable' ]; |
||
162 | } // End If Statement |
||
163 | |||
164 | // Add filter for theme overrides |
||
165 | $disable_styles = apply_filters( 'sensei_disable_styles', $disable_styles ); |
||
166 | |||
167 | if ( ! $disable_styles ) { |
||
168 | |||
169 | wp_register_style( Sensei()->token . '-frontend', Sensei()->plugin_url . 'assets/css/frontend/sensei.css', '', Sensei()->version, 'screen' ); |
||
170 | wp_enqueue_style( Sensei()->token . '-frontend' ); |
||
171 | |||
172 | // Allow additional stylesheets to be loaded |
||
173 | do_action( 'sensei_additional_styles' ); |
||
174 | |||
175 | } // End If Statement |
||
176 | |||
177 | } // End enqueue_styles() |
||
178 | |||
179 | |||
180 | /** |
||
181 | * sensei_get_template_part function. |
||
182 | * |
||
183 | * @deprecated sine 1.9.0 |
||
184 | * @access public |
||
185 | * @param mixed $slug |
||
186 | * @param string $name (default: '') |
||
187 | * @return void |
||
188 | */ |
||
189 | function sensei_get_template_part( $slug, $name = '' ) { |
||
190 | |||
191 | _deprecated_function( 'class-woothemes-sensei-frontend.php', '1.9.0', 'Sensei_Templates::get_part' ); |
||
192 | Sensei_Templates::get_part( $slug, $name ); |
||
193 | |||
194 | } // End sensei_get_template_part() |
||
195 | |||
196 | /** |
||
197 | * sensei_get_template function. |
||
198 | * |
||
199 | * @deprecated since 1.9.0 |
||
200 | * @access public |
||
201 | * @param mixed $template_name |
||
202 | * @param array $args (default: array()) |
||
203 | * @param string $template_path (default: '') |
||
204 | * @param string $default_path (default: '') |
||
205 | * @return void |
||
206 | */ |
||
207 | function sensei_get_template( $template_name, $args = array(), $template_path = '', $default_path = '' ) { |
||
208 | |||
209 | _deprecated_function( 'sensei_get_template', '1.9.0', 'Sensei_Templates::get_template' ); |
||
210 | Sensei_Templates::get_template($template_name, $args, $template_path, $default_path ); |
||
211 | |||
212 | } // End sensei_get_template() |
||
213 | |||
214 | |||
215 | /** |
||
216 | * sensei_locate_template function. |
||
217 | * |
||
218 | * @access public |
||
219 | * @param mixed $template_name |
||
220 | * @param string $template_path (default: '') |
||
221 | * @param string $default_path (default: '') |
||
222 | * @return void |
||
223 | */ |
||
224 | function sensei_locate_template( $template_name, $template_path = '', $default_path = '' ) { |
||
225 | |||
226 | _deprecated_function( 'sensei_locate_template', '1.9.0', 'Sensei_Templates::locate_template' ); |
||
227 | Sensei_Templates::locate_template( $template_name, $template_path, $default_path ); |
||
228 | |||
229 | } // End sensei_locate_template() |
||
230 | |||
231 | |||
232 | /** |
||
233 | * sensei_output_content_wrapper function. |
||
234 | * |
||
235 | * @access public |
||
236 | * @return void |
||
237 | */ |
||
238 | View Code Duplication | function sensei_output_content_wrapper() { |
|
239 | |||
240 | // backwards compatibility check for old location under the wrappers directory of the active theme |
||
241 | $backwards_compatible_wrapper_location = array( |
||
242 | Sensei()->template_url . 'wrappers/wrapper-start.php', |
||
243 | 'wrappers/wrapper-start.php' |
||
244 | ); |
||
245 | |||
246 | $template = locate_template( $backwards_compatible_wrapper_location ); |
||
247 | if( !empty( $template ) ){ |
||
248 | |||
249 | Sensei_Templates::get_template( 'wrappers/wrapper-start.php' ); |
||
250 | return; |
||
251 | |||
252 | } |
||
253 | |||
254 | Sensei_Templates::get_template( 'globals/wrapper-start.php' ); |
||
255 | |||
256 | } // End sensei_output_content_wrapper() |
||
257 | |||
258 | |||
259 | /** |
||
260 | * sensei_output_content_wrapper_end function. |
||
261 | * |
||
262 | * @access public |
||
263 | * @return void |
||
264 | */ |
||
265 | View Code Duplication | function sensei_output_content_wrapper_end() { |
|
266 | |||
267 | // backwards compatibility check for old location under the wrappers directory of the active theme |
||
268 | $backwards_compatible_wrapper_location = array( |
||
269 | Sensei()->template_url . 'wrappers/wrapper-end.php', |
||
270 | 'wrappers/wrapper-end.php' |
||
271 | ); |
||
272 | |||
273 | $backwards_compatible_template = locate_template( $backwards_compatible_wrapper_location ); |
||
274 | if( !empty( $backwards_compatible_template ) ){ |
||
275 | |||
276 | Sensei_Templates::get_template( 'wrappers/wrapper-end.php' ); |
||
277 | return; |
||
278 | |||
279 | } |
||
280 | |||
281 | |||
282 | Sensei_Templates::get_template( 'globals/wrapper-end.php' ); |
||
283 | |||
284 | } // End sensei_output_content_wrapper_end() |
||
285 | |||
286 | |||
287 | /** |
||
288 | * sensei_output_content_pagination function. |
||
289 | * |
||
290 | * @access public |
||
291 | * @return void |
||
292 | */ |
||
293 | public static function load_content_pagination() { |
||
294 | |||
295 | if( is_singular('course') ) { |
||
296 | |||
297 | // backwards compatibility check for old location under the wrappers directory of the active theme |
||
298 | $template = locate_template( array( Sensei()->template_url . 'wrappers/pagination-posts.php' ) ); |
||
299 | if( !empty( $template ) ){ |
||
300 | |||
301 | Sensei_Templates::get_template( 'wrappers/pagination-posts.php' ); |
||
302 | return; |
||
303 | |||
304 | } |
||
305 | |||
306 | Sensei_Templates::get_template( 'globals/pagination-posts.php' ); |
||
307 | |||
308 | View Code Duplication | } elseif( is_singular('lesson') ) { |
|
309 | |||
310 | // backwards compatibility check for old location under the wrappers directory of the active theme |
||
311 | $template = locate_template( array( Sensei()->template_url . 'wrappers/pagination-lesson.php' ) ); |
||
312 | if( !empty( $template ) ){ |
||
313 | |||
314 | Sensei_Templates::get_template( 'wrappers/pagination-lesson.php' ); |
||
315 | return; |
||
316 | |||
317 | } |
||
318 | |||
319 | Sensei_Templates::get_template( 'globals/pagination-lesson.php' ); |
||
320 | |||
321 | } elseif( is_singular('quiz') ) { |
||
322 | |||
323 | // backwards compatibility check for old location under the wrappers directory of the active theme |
||
324 | $template = locate_template( array( Sensei()->template_url . 'wrappers/pagination-quiz.php' ) ); |
||
325 | if( !empty( $template ) ){ |
||
326 | |||
327 | Sensei_Templates::get_template( 'wrappers/pagination-quiz.php' ); |
||
328 | return; |
||
329 | |||
330 | } |
||
331 | |||
332 | Sensei_Templates::get_template( 'globals/pagination-quiz.php' ); |
||
333 | |||
334 | View Code Duplication | } else { |
|
335 | |||
336 | // backwards compatibility check for old location under the wrappers directory of the active theme |
||
337 | $template = locate_template( array( Sensei()->template_url . 'wrappers/pagination.php' ) ); |
||
338 | if( !empty( $template ) ){ |
||
339 | |||
340 | Sensei_Templates::get_template( 'wrappers/pagination.php' ); |
||
341 | return; |
||
342 | |||
343 | } |
||
344 | |||
345 | Sensei_Templates::get_template( 'globals/pagination.php' ); |
||
346 | |||
347 | } // End If Statement |
||
348 | |||
349 | } // End sensei_output_content_pagination() |
||
350 | |||
351 | /** |
||
352 | * outputs comments for the specified pages |
||
353 | * @deprecated |
||
354 | * @return void |
||
355 | */ |
||
356 | function sensei_output_comments() { |
||
357 | |||
358 | Sensei_Lesson::output_comments(); |
||
359 | |||
360 | } // End sensei_output_comments() |
||
361 | |||
362 | /** |
||
363 | * sensei_setup_nav_menu_item function. |
||
364 | * |
||
365 | * Generate the urls for Sensei custom menu items. |
||
366 | * |
||
367 | * @access public |
||
368 | * @param object $item |
||
369 | * @return object $item |
||
370 | */ |
||
371 | public function sensei_setup_nav_menu_item( $item ) { |
||
372 | global $pagenow, $wp_rewrite; |
||
373 | |||
374 | if( 'nav-menus.php' != $pagenow && !defined('DOING_AJAX') && isset( $item->url ) && 'custom' == $item->type ) { |
||
375 | |||
376 | // Set up Sensei menu links |
||
377 | $course_page_id = intval( Sensei()->settings->settings[ 'course_page' ] ); |
||
378 | $my_account_page_id = intval( Sensei()->settings->settings[ 'my_course_page' ] ); |
||
379 | |||
380 | $course_page_url = Sensei_Course::get_courses_page_url(); |
||
381 | $lesson_archive_url = get_post_type_archive_link( 'lesson' ); |
||
382 | $my_courses_url = get_permalink( $my_account_page_id ); |
||
383 | $my_messages_url = get_post_type_archive_link( 'sensei_message' ); |
||
384 | |||
385 | switch ( $item->url ) { |
||
386 | case '#senseicourses': |
||
387 | $item->url = $course_page_url; |
||
388 | break; |
||
389 | |||
390 | case '#senseilessons': |
||
391 | $item->url = $lesson_archive_url; |
||
392 | break; |
||
393 | |||
394 | case '#senseimycourses': |
||
395 | $item->url = $my_courses_url; |
||
396 | break; |
||
397 | |||
398 | case '#senseimymessages': |
||
399 | $item->url = $my_messages_url; |
||
400 | // if no archive link exist for sensei_message |
||
401 | // set it back to the place holder |
||
402 | if( ! $item->url ){ |
||
403 | |||
404 | $item->url = '#senseimymessages'; |
||
405 | |||
406 | } |
||
407 | break; |
||
408 | |||
409 | case '#senseilearnerprofile': |
||
410 | $item->url = esc_url( Sensei()->learner_profiles->get_permalink() ); |
||
411 | break; |
||
412 | |||
413 | case '#senseiloginlogout': |
||
414 | $logout_url = wp_logout_url( home_url() ); |
||
415 | // Login link links to the My Courses page, to avoid the WP dashboard. |
||
416 | $login_url = $my_courses_url; |
||
417 | |||
418 | $item->url = ( is_user_logged_in() ? $logout_url : $login_url ); |
||
419 | |||
420 | // determine the menu title login or logout |
||
421 | if ( is_user_logged_in() ) { |
||
422 | $menu_title = __( 'Logout' ,'woothemes-sensei'); |
||
423 | } else { |
||
424 | $menu_title = __( 'Login' ,'woothemes-sensei'); |
||
425 | } |
||
426 | |||
427 | /** |
||
428 | * Action Filter: login/logout menu title |
||
429 | * |
||
430 | * With this filter you can alter the login / login menu item title string |
||
431 | * |
||
432 | * @param $menu_title |
||
433 | */ |
||
434 | $item->title = apply_filters( 'sensei_login_logout_menu_title', $menu_title ); |
||
435 | |||
436 | break; |
||
437 | |||
438 | default: |
||
439 | break; |
||
440 | } |
||
441 | |||
442 | $_root_relative_current = untrailingslashit( $_SERVER['REQUEST_URI'] ); |
||
443 | $current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_root_relative_current ); |
||
444 | $item_url = untrailingslashit( $item->url ); |
||
445 | $_indexless_current = untrailingslashit( preg_replace( '/' . preg_quote( $wp_rewrite->index, '/' ) . '$/', '', $current_url ) ); |
||
446 | // Highlight current menu item |
||
447 | if ( $item_url && in_array( $item_url, array( $current_url, $_indexless_current, $_root_relative_current ) ) ) { |
||
448 | $item->classes[] = 'current-menu-item current_page_item'; |
||
449 | } |
||
450 | |||
451 | } // endif nav |
||
452 | |||
453 | return $item; |
||
454 | |||
455 | } // End sensei_setup_nav_menu_item() |
||
456 | |||
457 | /** |
||
458 | * sensei_wp_nav_menu_objects function. |
||
459 | * |
||
460 | * Remove Sensei custom menu items depending on settings and logged in status. |
||
461 | * |
||
462 | * @access public |
||
463 | * @param object $sorted_menu_items |
||
464 | * @return object $sorted_menu_items |
||
465 | */ |
||
466 | public function sensei_wp_nav_menu_objects( $sorted_menu_items ) { |
||
467 | |||
468 | foreach( $sorted_menu_items as $k=>$item ) { |
||
469 | |||
470 | // Remove the My Messages link for logged out users or if Private Messages are disabled |
||
471 | View Code Duplication | if( ! get_post_type_archive_link( 'sensei_message' ) |
|
472 | && '#senseimymessages' == $item->url ) { |
||
473 | |||
474 | if ( !is_user_logged_in() || ( isset( Sensei()->settings->settings['messages_disable'] ) && Sensei()->settings->settings['messages_disable'] ) ) { |
||
475 | |||
476 | unset( $sorted_menu_items[$k] ); |
||
477 | |||
478 | } |
||
479 | } |
||
480 | // Remove the My Profile link for logged out users. |
||
481 | View Code Duplication | if( Sensei()->learner_profiles->get_permalink() == $item->url ) { |
|
482 | |||
483 | if ( !is_user_logged_in() || ! ( isset( Sensei()->settings->settings[ 'learner_profile_enable' ] ) && Sensei()->settings->settings[ 'learner_profile_enable' ] ) ) { |
||
484 | |||
485 | unset( $sorted_menu_items[$k] ); |
||
486 | |||
487 | } |
||
488 | } |
||
489 | } |
||
490 | return $sorted_menu_items; |
||
491 | } // End sensei_wp_nav_menu_objects |
||
492 | |||
493 | // add category nicenames in body and post class |
||
494 | function sensei_search_results_classes($classes) { |
||
495 | global $post; |
||
496 | // Handle Search Classes for Courses, Lessons, and WC Products |
||
497 | if ( isset( $post->post_type ) && ( ( 'course' == $post->post_type ) || ( 'lesson' == $post->post_type ) || ( 'product' == $post->post_type ) ) ) { |
||
498 | $classes[] = 'post'; |
||
499 | } // End If Statement |
||
500 | return $classes; |
||
501 | } // End sensei_search_results_classes() |
||
502 | |||
503 | /** |
||
504 | * sensei_single_title output for single page title |
||
505 | * @since 1.1.0 |
||
506 | * @return void |
||
507 | * @deprecated |
||
508 | */ |
||
509 | function the_single_title() { |
||
510 | |||
511 | _deprecated_function(' WooThemes_Sensei_Frontend::the_single_title', '1.9.0'); |
||
512 | |||
513 | } // End sensei_single_title() |
||
514 | |||
515 | /** |
||
516 | * sensei_course_image output for course image Please use Sensei()->course->course_image instead. |
||
517 | * |
||
518 | * @deprecated since 1.9.0 |
||
519 | * @param $course_id |
||
520 | * @param string $width |
||
521 | * @param string $height |
||
522 | * @param bool|false $return |
||
523 | * @return string|void |
||
524 | */ |
||
525 | function sensei_course_image( $course_id, $width = '100', $height = '100', $return = false ) { |
||
526 | |||
527 | if ( ! $return ) { |
||
528 | |||
529 | echo Sensei()->course->course_image( $course_id, $width, $height ); |
||
530 | return ''; |
||
531 | |||
532 | } // End If Statement |
||
533 | |||
534 | return Sensei()->course->course_image( $course_id, $width, $height ); |
||
535 | |||
536 | } // End sensei_course_image() |
||
537 | |||
538 | /** |
||
539 | * sensei_lesson_image output for lesson image |
||
540 | * @since 1.2.0 |
||
541 | * @deprecated since 1.9.0 |
||
542 | * @param $lesson_id |
||
543 | * @param string $width |
||
544 | * @param string $height |
||
545 | * @param bool|false $return |
||
546 | * @param bool|false $widget |
||
547 | * @return string |
||
548 | */ |
||
549 | function sensei_lesson_image( $lesson_id, $width = '100', $height = '100', $return = false, $widget = false ) { |
||
550 | |||
551 | if( ! $return ){ |
||
552 | |||
553 | echo Sensei()->lesson->lesson_image( $lesson_id, $width, $height, $widget ); |
||
554 | return ''; |
||
555 | } |
||
556 | |||
557 | return Sensei()->lesson->lesson_image( $lesson_id, $width, $height, $widget ); |
||
558 | |||
559 | } // End sensei_lesson_image() |
||
560 | |||
561 | /** |
||
562 | * @since 1.0.0 |
||
563 | * @param WP_Query $query |
||
564 | */ |
||
565 | function sensei_course_archive_pagination( $query ) { |
||
566 | |||
567 | if( ! is_admin() && $query->is_main_query() && isset( $_GET['action'] ) && in_array( $_GET['action'], array( 'newcourses', 'featuredcourses', 'freecourses', 'paidcourses' ) ) ) { |
||
568 | |||
569 | $amount = 0; |
||
570 | if ( isset( Sensei()->settings->settings[ 'course_archive_amount' ] ) && ( 0 < absint( Sensei()->settings->settings[ 'course_archive_amount' ] ) ) ) { |
||
571 | $amount = absint( Sensei()->settings->settings[ 'course_archive_amount' ] ); |
||
572 | } |
||
573 | |||
574 | if( $amount ) { |
||
575 | $query->set( 'posts_per_page', $amount ); |
||
576 | } |
||
577 | |||
578 | $query->set( 'orderby', 'menu_order date' ); |
||
579 | |||
580 | } |
||
581 | } |
||
582 | |||
583 | /** |
||
584 | * sensei_course_archive_header function. |
||
585 | * |
||
586 | * @access public |
||
587 | * @since 1.2.0 |
||
588 | * @deprecated since 1.9.0 use WooThemes_Sensei_Course::archive_header |
||
589 | * @return void |
||
590 | */ |
||
591 | function sensei_course_archive_header( ) { |
||
592 | |||
593 | trigger_error('This function sensei_course_archive_header has been depricated. Please use: WooThemes_Sensei_Course::course_archive_header '); |
||
594 | WooThemes_Sensei_Course::archive_header( '', '<header class="archive-header"><h1>', '</h1></header>' ); |
||
595 | |||
596 | } // sensei_course_archive_header() |
||
597 | |||
598 | /** |
||
599 | * sensei_lesson_archive_header function. |
||
600 | * |
||
601 | * @deprecated since 1.9.0 |
||
602 | * @access public |
||
603 | * @since 1.2.1 |
||
604 | * @return void |
||
605 | */ |
||
606 | public function sensei_lesson_archive_header( ) { |
||
607 | _deprecated_function( 'WooThemes_Sensei_Frontend::sensei_lesson_archive_header', '1.9.0', 'WooThemes_Sensei_Lesson::the_archive_header' ); |
||
608 | Sensei()->lesson->the_archive_header(); |
||
609 | } // sensei_course_archive_header() |
||
610 | |||
611 | /** |
||
612 | * @deprecated since 1.9.0 |
||
613 | */ |
||
614 | public function sensei_message_archive_header( ){ |
||
615 | _deprecated_function('Sensei_Frontend::sensei_message_archive_header','Please use: Sense'); |
||
616 | Sensei_Messages::the_archive_header(); |
||
617 | } // sensei_message_archive_header() |
||
618 | |||
619 | /** |
||
620 | * sensei_course_archive_course_title output for course archive page individual course title |
||
621 | * @since 1.2.0 |
||
622 | * @param WP_Post $post_item |
||
623 | * @return void |
||
624 | */ |
||
625 | function sensei_course_archive_course_title( $post_item ) { |
||
626 | if ( isset( $post_item->ID ) && ( 0 < $post_item->ID ) ) { |
||
627 | $post_id = absint( $post_item->ID ); |
||
628 | $post_title = $post_item->post_title; |
||
629 | } else { |
||
630 | $post_id = get_the_ID(); |
||
631 | $post_title = get_the_title(); |
||
632 | } // End If Statement |
||
633 | ?><header><h2><a href="<?php echo get_permalink( $post_id ); ?>" title="<?php echo esc_attr( $post_title ); ?>"><?php echo $post_title; ?></a></h2></header><?php |
||
634 | } // End sensei_course_archive_course_title() |
||
635 | |||
636 | /** |
||
637 | * sensei_lesson_archive_lesson_title output for course archive page individual course title |
||
638 | * @since 1.2.1 |
||
639 | * @return void |
||
640 | */ |
||
641 | public function sensei_lesson_archive_lesson_title() { |
||
642 | $post_id = get_the_ID(); |
||
643 | $post_title = get_the_title(); |
||
644 | ?><header><h2><a href="<?php echo get_permalink( $post_id ); ?>" title="<?php echo esc_attr( $post_title ); ?>"><?php echo $post_title; ?></a></h2></header><?php |
||
645 | } // End sensei_lesson_archive_lesson_title() |
||
646 | |||
647 | /** |
||
648 | * sensei_breadcrumb outputs Sensei breadcrumb trail on lesson & quiz pages |
||
649 | * @since 1.7.0 |
||
650 | * @param integer $id course, lesson or quiz id |
||
651 | * @return void |
||
652 | */ |
||
653 | public function sensei_breadcrumb( $id = 0 ) { |
||
654 | |||
655 | // Only output on lesson, quiz and taxonomy (module) pages |
||
656 | if( ! ( is_tax( 'module' ) || is_singular( 'lesson' ) || is_singular( 'quiz' ) ) ) return; |
||
657 | |||
658 | if( empty( $id ) ){ |
||
659 | |||
660 | $id = get_the_ID(); |
||
661 | |||
662 | } |
||
663 | |||
664 | $sensei_breadcrumb_prefix = __( 'Back to: ', 'woothemes-sensei' ); |
||
665 | $separator = apply_filters( 'sensei_breadcrumb_separator', '>' ); |
||
666 | |||
667 | $html = '<section class="sensei-breadcrumb">' . $sensei_breadcrumb_prefix; |
||
668 | // Lesson |
||
669 | View Code Duplication | if ( is_singular( 'lesson' ) && 0 < intval( $id ) ) { |
|
670 | $course_id = intval( get_post_meta( $id, '_lesson_course', true ) ); |
||
671 | if( ! $course_id ) { |
||
672 | return; |
||
673 | } |
||
674 | $html .= '<a href="' . esc_url( get_permalink( $course_id ) ) . '" title="' . __( 'Back to the course', 'woothemes-sensei' ) . '">' . get_the_title( $course_id ) . '</a>'; |
||
675 | } // End If Statement |
||
676 | // Quiz |
||
677 | View Code Duplication | if ( is_singular( 'quiz' ) && 0 < intval( $id ) ) { |
|
678 | $lesson_id = intval( get_post_meta( $id, '_quiz_lesson', true ) ); |
||
679 | if( ! $lesson_id ) { |
||
680 | return; |
||
681 | } |
||
682 | $html .= '<a href="' . esc_url( get_permalink( $lesson_id ) ) . '" title="' . __( 'Back to the lesson', 'woothemes-sensei' ) . '">' . get_the_title( $lesson_id ) . '</a>'; |
||
683 | } // End If Statement |
||
684 | |||
685 | // Allow other plugins to filter html |
||
686 | $html = apply_filters ( 'sensei_breadcrumb_output', $html, $separator ); |
||
687 | $html .= '</section>'; |
||
688 | |||
689 | echo $html; |
||
690 | } // End sensei_breadcrumb() |
||
691 | |||
692 | |||
693 | /** |
||
694 | * @deprecated since 1.9.0 use WooThemes_Sensei_Lesson::course_signup_link instead |
||
695 | */ |
||
696 | public function sensei_lesson_course_signup_link( ) { |
||
697 | |||
698 | _deprecated_function('sensei_lesson_course_signup_link', '1.9.0', 'WooThemes_Sensei_Lesson::course_signup_link' ); |
||
699 | WooThemes_Sensei_Lesson::course_signup_link(); |
||
700 | } |
||
701 | |||
702 | public function lesson_tags_display( $lesson_id = 0 ) { |
||
703 | if( $lesson_id ) { |
||
704 | $tags = wp_get_post_terms( $lesson_id, 'lesson-tag' ); |
||
705 | if( $tags && count( $tags ) > 0 ) { |
||
706 | $tag_list = ''; |
||
707 | foreach( $tags as $tag ) { |
||
708 | $tag_link = get_term_link( $tag, 'lesson-tag' ); |
||
709 | if( ! is_wp_error( $tag_link ) ) { |
||
710 | if( $tag_list ) { $tag_list .= ', '; } |
||
711 | $tag_list .= '<a href="' . $tag_link . '">' . $tag->name . '</a>'; |
||
712 | } |
||
713 | } |
||
714 | if( $tag_list ) { |
||
715 | ?><section class="lesson-tags"> |
||
716 | <?php printf( __( 'Lesson tags: %1$s', 'woothemes-sensei' ), $tag_list ); ?> |
||
717 | </section><?php |
||
718 | } |
||
719 | } |
||
720 | } |
||
721 | } |
||
722 | |||
723 | /** |
||
724 | * @param WP_Query $query |
||
725 | */ |
||
726 | public function lesson_tag_archive_filter( $query ) { |
||
727 | if( is_tax( 'lesson-tag' ) && $query->is_main_query() ) { |
||
728 | // Limit to lessons only |
||
729 | $query->set( 'post_type', 'lesson' ); |
||
730 | |||
731 | // Set order of lessons |
||
732 | $query->set( 'orderby', 'menu_order' ); |
||
733 | $query->set( 'order', 'ASC' ); |
||
734 | |||
735 | } |
||
736 | } |
||
737 | |||
738 | public function lesson_tag_archive_header( $title ) { |
||
739 | if( is_tax( 'lesson-tag' ) ) { |
||
740 | $title = sprintf( __( 'Lesson tag: %1$s', 'woothemes-sensei' ), apply_filters( 'sensei_lesson_tag_archive_title', get_queried_object()->name ) ); |
||
741 | } |
||
742 | return $title; |
||
743 | } |
||
744 | |||
745 | public function lesson_tag_archive_description() { |
||
746 | if( is_tax( 'lesson-tag' ) ) { |
||
747 | $tag = get_queried_object(); |
||
748 | echo '<p class="archive-description lesson-description">' . apply_filters( 'sensei_lesson_tag_archive_description', nl2br( $tag->description ), $tag->term_id ) . '</p>'; |
||
749 | } |
||
750 | } |
||
751 | |||
752 | public function sensei_complete_lesson() { |
||
753 | global $post, $current_user; |
||
754 | // Handle Quiz Completion |
||
755 | if ( isset( $_POST['quiz_action'] ) && wp_verify_nonce( $_POST[ 'woothemes_sensei_complete_lesson_noonce' ], 'woothemes_sensei_complete_lesson_noonce' ) ) { |
||
756 | |||
757 | $sanitized_submit = esc_html( $_POST['quiz_action'] ); |
||
758 | |||
759 | switch ($sanitized_submit) { |
||
760 | case 'lesson-complete': |
||
761 | |||
762 | Sensei_Utils::sensei_start_lesson( $post->ID, $current_user->ID, $complete = true ); |
||
763 | |||
764 | break; |
||
765 | |||
766 | case 'lesson-reset': |
||
767 | |||
768 | Sensei_Utils::sensei_remove_user_from_lesson( $post->ID, $current_user->ID ); |
||
769 | |||
770 | $this->messages = '<div class="sensei-message note">' . __( 'Lesson Reset Successfully.', 'woothemes-sensei' ) . '</div>'; |
||
771 | break; |
||
772 | |||
773 | default: |
||
774 | // Nothing |
||
775 | break; |
||
776 | |||
777 | } // End Switch Statement |
||
778 | |||
779 | } // End If Statement |
||
780 | |||
781 | } // End sensei_complete_lesson() |
||
782 | |||
783 | public function sensei_complete_course() { |
||
784 | global $post, $current_user, $wp_query; |
||
785 | if ( isset( $_POST['course_complete'] ) && wp_verify_nonce( $_POST[ 'woothemes_sensei_complete_course_noonce' ], 'woothemes_sensei_complete_course_noonce' ) ) { |
||
786 | |||
787 | $sanitized_submit = esc_html( $_POST['course_complete'] ); |
||
788 | $sanitized_course_id = absint( esc_html( $_POST['course_complete_id'] ) ); |
||
789 | // Handle submit data |
||
790 | switch ($sanitized_submit) { |
||
791 | case __( 'Mark as Complete', 'woothemes-sensei' ): |
||
792 | |||
793 | // Add user to course |
||
794 | $course_metadata = array( |
||
795 | 'start' => current_time('mysql'), |
||
796 | 'percent' => 0, // No completed lessons yet |
||
797 | 'complete' => 0, |
||
798 | ); |
||
799 | $activity_logged = Sensei_Utils::update_course_status( $current_user->ID, $sanitized_course_id, 'in-progress', $course_metadata ); |
||
800 | |||
801 | if ( $activity_logged ) { |
||
802 | // Get all course lessons |
||
803 | $course_lesson_ids = Sensei()->course->course_lessons( $sanitized_course_id, 'any', 'ids' ); |
||
804 | // Mark all quiz user meta lessons as complete |
||
805 | foreach ( $course_lesson_ids as $lesson_item_id ){ |
||
806 | // Mark lesson as complete |
||
807 | $activity_logged = Sensei_Utils::sensei_start_lesson( $lesson_item_id, $current_user->ID, $complete = true ); |
||
808 | } // End For Loop |
||
809 | |||
810 | // Update with final stats |
||
811 | $course_metadata = array( |
||
812 | 'percent' => 100, |
||
813 | 'complete' => count($course_lesson_ids), |
||
814 | ); |
||
815 | $activity_logged = Sensei_Utils::update_course_status( $current_user->ID, $sanitized_course_id, 'complete', $course_metadata ); |
||
816 | |||
817 | do_action( 'sensei_user_course_end', $current_user->ID, $sanitized_course_id ); |
||
818 | |||
819 | // Success message |
||
820 | $this->messages = '<header class="archive-header"><div class="sensei-message tick">' . sprintf( __( '%1$s marked as complete.', 'woothemes-sensei' ), get_the_title( $sanitized_course_id ) ) . '</div></header>'; |
||
821 | } // End If Statement |
||
822 | |||
823 | break; |
||
824 | |||
825 | case __( 'Delete Course', 'woothemes-sensei' ): |
||
826 | |||
827 | Sensei_Utils::sensei_remove_user_from_course( $sanitized_course_id, $current_user->ID ); |
||
828 | |||
829 | // Success message |
||
830 | $this->messages = '<header class="archive-header"><div class="sensei-message tick">' . sprintf( __( '%1$s deleted.', 'woothemes-sensei' ), get_the_title( $sanitized_course_id ) ) . '</div></header>'; |
||
831 | break; |
||
832 | |||
833 | default: |
||
834 | // Nothing |
||
835 | break; |
||
836 | } // End Switch Statement |
||
837 | |||
838 | } // End If Statement |
||
839 | } // End sensei_complete_course() |
||
840 | |||
841 | /** |
||
842 | * @deprecated use WooThemes_Sensei_Quiz::get_user_answers |
||
843 | * @param int $lesson_id |
||
844 | * @return array |
||
845 | */ |
||
846 | public function sensei_get_user_quiz_answers( $lesson_id = 0 ) { |
||
847 | global $current_user; |
||
848 | |||
849 | $user_answers = array(); |
||
850 | |||
851 | if ( 0 < intval( $lesson_id ) ) { |
||
852 | $lesson_quiz_questions = Sensei()->lesson->lesson_quiz_questions( $lesson_id ); |
||
853 | foreach( $lesson_quiz_questions as $question ) { |
||
854 | $answer = maybe_unserialize( base64_decode( Sensei_Utils::sensei_get_activity_value( array( 'post_id' => $question->ID, 'user_id' => $current_user->ID, 'type' => 'sensei_user_answer', 'field' => 'comment_content' ) ) ) ); |
||
855 | $user_answers[ $question->ID ] = $answer; |
||
856 | } |
||
857 | } |
||
858 | |||
859 | return $user_answers; |
||
860 | } // End sensei_get_user_quiz_answers() |
||
861 | |||
862 | public function sensei_has_user_completed_lesson( $post_id = 0, $user_id = 0 ) { |
||
863 | _deprecated_function( __FUNCTION__, '1.7', "WooThemes_Sensei_Utils::user_completed_lesson()" ); |
||
864 | return Sensei_Utils::user_completed_lesson( $post_id, $user_id ); |
||
865 | } // End sensei_has_user_completed_lesson() |
||
866 | |||
867 | /** |
||
868 | * |
||
869 | */ |
||
870 | public function sensei_frontend_messages() { |
||
871 | Sensei()->notices->maybe_print_notices(); |
||
872 | } // End sensei_frontend_messages() |
||
873 | |||
874 | View Code Duplication | public function sensei_lesson_video( $post_id = 0 ) { |
|
875 | if ( 0 < intval( $post_id ) ) { |
||
876 | $lesson_video_embed = get_post_meta( $post_id, '_lesson_video_embed', true ); |
||
877 | if ( 'http' == substr( $lesson_video_embed, 0, 4) ) { |
||
878 | // V2 - make width and height a setting for video embed |
||
879 | $lesson_video_embed = wp_oembed_get( esc_url( $lesson_video_embed )/*, array( 'width' => 100 , 'height' => 100)*/ ); |
||
880 | } // End If Statement |
||
881 | if ( '' != $lesson_video_embed ) { |
||
882 | ?><div class="video"><?php echo html_entity_decode($lesson_video_embed); ?></div><?php |
||
883 | } // End If Statement |
||
884 | } // End If Statement |
||
885 | } // End sensei_lesson_video() |
||
886 | |||
887 | public function sensei_complete_lesson_button() { |
||
888 | global $post; |
||
889 | |||
890 | $quiz_id = 0; |
||
891 | |||
892 | //make sure user is taking course |
||
893 | $course_id = Sensei()->lesson->get_course_id( $post->ID ); |
||
894 | if( ! Sensei_Utils::user_started_course( $course_id, get_current_user_id() ) ){ |
||
0 ignored issues
–
show
|
|||
895 | return; |
||
896 | } |
||
897 | |||
898 | // Lesson quizzes |
||
899 | $quiz_id = Sensei()->lesson->lesson_quizzes( $post->ID ); |
||
900 | $pass_required = true; |
||
901 | if( $quiz_id ) { |
||
902 | // Get quiz pass setting |
||
903 | $pass_required = get_post_meta( $quiz_id, '_pass_required', true ); |
||
904 | } |
||
905 | if( ! $quiz_id || ( $quiz_id && ! $pass_required ) ) { |
||
906 | ?> |
||
907 | <form class="lesson_button_form" method="POST" action="<?php echo esc_url( get_permalink() ); ?>"> |
||
908 | <input type="hidden" |
||
909 | name="woothemes_sensei_complete_lesson_noonce" |
||
910 | id="woothemes_sensei_complete_lesson_noonce" |
||
911 | value="<?php echo esc_attr( wp_create_nonce( 'woothemes_sensei_complete_lesson_noonce' ) ); ?>" |
||
912 | /> |
||
913 | |||
914 | <input type="hidden" name="quiz_action" value="lesson-complete" /> |
||
915 | |||
916 | <input type="submit" |
||
917 | name="quiz_complete" |
||
918 | class="quiz-submit complete" |
||
919 | value="<?php _e( 'Complete Lesson', 'woothemes-sensei' ); ?>"/> |
||
920 | |||
921 | </form> |
||
922 | <?php |
||
923 | } // End If Statement |
||
924 | } // End sensei_complete_lesson_button() |
||
925 | |||
926 | public function sensei_reset_lesson_button() { |
||
927 | global $post; |
||
928 | |||
929 | $quiz_id = 0; |
||
930 | |||
931 | // Lesson quizzes |
||
932 | $quiz_id = Sensei()->lesson->lesson_quizzes( $post->ID ); |
||
933 | $reset_allowed = true; |
||
934 | if( $quiz_id ) { |
||
935 | // Get quiz pass setting |
||
936 | $reset_allowed = get_post_meta( $quiz_id, '_enable_quiz_reset', true ); |
||
937 | } |
||
938 | View Code Duplication | if ( ! $quiz_id || !empty($reset_allowed) ) { |
|
939 | ?> |
||
940 | <form method="POST" action="<?php echo esc_url( get_permalink() ); ?>"> |
||
941 | |||
942 | <input |
||
943 | type="hidden" |
||
944 | name="<?php echo esc_attr( 'woothemes_sensei_complete_lesson_noonce' ); ?>" |
||
945 | id="<?php echo esc_attr( 'woothemes_sensei_complete_lesson_noonce' ); ?>" |
||
946 | value="<?php echo esc_attr( wp_create_nonce( 'woothemes_sensei_complete_lesson_noonce' ) ); ?>" /> |
||
947 | |||
948 | <input type="hidden" name="quiz_action" value="lesson-reset" /> |
||
949 | |||
950 | <input type="submit" name="quiz_complete" class="quiz-submit reset" value="<?php _e( 'Reset Lesson', 'woothemes-sensei' ); ?>"/> |
||
951 | |||
952 | </form> |
||
953 | <?php |
||
954 | } // End If Statement |
||
955 | } // End sensei_reset_lesson_button() |
||
956 | |||
957 | /** |
||
958 | * @deprecated since 1.9.0 |
||
959 | */ |
||
960 | public function sensei_lesson_quiz_meta( ) { |
||
961 | |||
962 | Sensei_Lesson::footer_quiz_call_to_action(); |
||
963 | |||
964 | } // End sensei_lesson_quiz_meta() |
||
965 | |||
966 | public function sensei_course_archive_meta() { |
||
967 | global $post; |
||
968 | // Meta data |
||
969 | $post_id = get_the_ID(); |
||
970 | $post_title = get_the_title(); |
||
971 | $author_display_name = get_the_author(); |
||
972 | $author_id = get_the_author_meta('ID'); |
||
973 | $category_output = get_the_term_list( $post_id, 'course-category', '', ', ', '' ); |
||
974 | $free_lesson_count = intval( Sensei()->course->course_lesson_preview_count( $post_id ) ); |
||
975 | ?><section class="entry"> |
||
976 | <p class="sensei-course-meta"> |
||
977 | View Code Duplication | <?php if ( isset( Sensei()->settings->settings[ 'course_author' ] ) && ( Sensei()->settings->settings[ 'course_author' ] ) ) { ?> |
|
978 | <span class="course-author"><?php _e( 'by ', 'woothemes-sensei' ); ?><?php the_author_link(); ?></span> |
||
979 | <?php } // End If Statement ?> |
||
980 | <span class="course-lesson-count"><?php echo Sensei()->course->course_lesson_count( $post_id ) . ' ' . __( 'Lessons', 'woothemes-sensei' ); ?></span> |
||
981 | <?php if ( '' != $category_output ) { ?> |
||
982 | <span class="course-category"><?php echo sprintf( __( 'in %s', 'woothemes-sensei' ), $category_output ); ?></span> |
||
983 | <?php } // End If Statement ?> |
||
984 | <?php sensei_simple_course_price( $post_id ); ?> |
||
985 | </p> |
||
986 | <p class="course-excerpt"><?php the_excerpt(); ?></p> |
||
987 | View Code Duplication | <?php if ( 0 < $free_lesson_count ) { |
|
988 | $free_lessons = sprintf( __( 'You can access %d of this course\'s lessons for free', 'woothemes-sensei' ), $free_lesson_count ); ?> |
||
989 | <p class="sensei-free-lessons"><a href="<?php echo get_permalink( $post_id ); ?>"><?php _e( 'Preview this course', 'woothemes-sensei' ) ?></a> - <?php echo $free_lessons; ?></p> |
||
990 | <?php } ?> |
||
991 | </section><?php |
||
992 | } // End sensei_course_archive_meta() |
||
993 | |||
994 | /** |
||
995 | * @deprecated since 1.9.0 |
||
996 | */ |
||
997 | public function sensei_single_main_content() { |
||
998 | _deprecated_function('Woothemes_Sensei_Frontend::sensei_single_main_content', '1.9.0'); |
||
999 | } // End sensei_single_main_content() |
||
1000 | |||
1001 | /** |
||
1002 | * @deprecated since 1.9.0 |
||
1003 | */ |
||
1004 | public function sensei_lesson_archive_main_content() { |
||
1005 | _deprecated_function('Sensei_Frontend::sensei_lesson_archive_main_content', '1.9.0', 'Please include loop-lesson.php directly'); |
||
1006 | } // End sensei_lesson_archive_main_content() |
||
1007 | |||
1008 | /** |
||
1009 | * @deprecated since 1.9.0 |
||
1010 | */ |
||
1011 | public function sensei_message_archive_main_content() { |
||
1012 | _deprecated_function( 'Sensei_Frontend::sensei_message_archive_main_content', 'This method is no longer needed' ); |
||
1013 | } // End sensei_lesson_archive_main_content() |
||
1014 | |||
1015 | /** |
||
1016 | * @deprecated since 1.9.0 |
||
1017 | */ |
||
1018 | public function sensei_no_permissions_main_content() { |
||
1019 | _deprecated_function( 'Sensei_Frontend::sensei_no_permissions_main_content', 'This method is no longer needed' ); |
||
1020 | } // End sensei_no_permissions_main_content() |
||
1021 | |||
1022 | public function sensei_course_category_main_content() { |
||
1023 | global $post; |
||
1024 | if ( have_posts() ) { ?> |
||
1025 | |||
1026 | <section id="main-course" class="course-container"> |
||
1027 | |||
1028 | <?php do_action( 'sensei_course_archive_header' ); ?> |
||
1029 | |||
1030 | <?php while ( have_posts() ) { the_post(); ?> |
||
1031 | |||
1032 | <article class="<?php echo join( ' ', get_post_class( array( 'course', 'post' ), get_the_ID() ) ); ?>"> |
||
1033 | |||
1034 | <?php sensei_do_deprecated_action('sensei_course_image','1.9.0', 'sensei_single_course_content_inside_before', get_the_ID() ); ?> |
||
1035 | |||
1036 | <?php sensei_do_deprecated_action( 'sensei_course_archive_course_title','1.9.0','sensei_course_content_inside_before', $post ); ?> |
||
1037 | |||
1038 | <?php do_action( 'sensei_course_archive_meta' ); ?> |
||
1039 | |||
1040 | </article> |
||
1041 | |||
1042 | <?php } // End While Loop ?> |
||
1043 | |||
1044 | </section> |
||
1045 | |||
1046 | <?php } else { ?> |
||
1047 | |||
1048 | <p> |
||
1049 | |||
1050 | <?php _e( 'No courses found that match your selection.', 'woothemes-sensei' ); ?> |
||
1051 | |||
1052 | </p> |
||
1053 | |||
1054 | <?php } // End If Statement |
||
1055 | |||
1056 | } // End sensei_course_category_main_content() |
||
1057 | |||
1058 | public function sensei_login_form() { |
||
1059 | ?> |
||
1060 | <div id="my-courses"> |
||
1061 | <?php Sensei()->notices->maybe_print_notices(); ?> |
||
1062 | <div class="col2-set" id="customer_login"> |
||
1063 | |||
1064 | <div class="col-1"> |
||
1065 | <?php |
||
1066 | // output the actual form markup |
||
1067 | Sensei_Templates::get_template( 'user/login-form.php'); |
||
1068 | ?> |
||
1069 | </div> |
||
1070 | |||
1071 | <?php |
||
1072 | if ( get_option('users_can_register') ) { |
||
1073 | |||
1074 | // get current url |
||
1075 | $action_url = get_permalink(); |
||
1076 | |||
1077 | ?> |
||
1078 | |||
1079 | <div class="col-2"> |
||
1080 | <h2><?php _e( 'Register', 'woothemes-sensei' ); ?></h2> |
||
1081 | |||
1082 | <form method="post" class="register" action="<?php echo esc_url( $action_url ); ?>" > |
||
1083 | |||
1084 | <?php do_action( 'sensei_register_form_start' ); ?> |
||
1085 | |||
1086 | <p class="form-row form-row-wide"> |
||
1087 | <label for="sensei_reg_username"><?php _e( 'Username', 'woothemes-sensei' ); ?> <span class="required">*</span></label> |
||
1088 | <input type="text" class="input-text" name="sensei_reg_username" id="sensei_reg_username" value="<?php if ( ! empty( $_POST['sensei_reg_username'] ) ) esc_attr_e( $_POST['sensei_reg_username'] ); ?>" /> |
||
1089 | </p> |
||
1090 | |||
1091 | <p class="form-row form-row-wide"> |
||
1092 | <label for="sensei_reg_email"><?php _e( 'Email address', 'woothemes-sensei' ); ?> <span class="required">*</span></label> |
||
1093 | <input type="email" class="input-text" name="sensei_reg_email" id="sensei_reg_email" value="<?php if ( ! empty( $_POST['sensei_reg_email'] ) ) esc_attr_e( $_POST['sensei_reg_email'] ); ?>" /> |
||
1094 | </p> |
||
1095 | |||
1096 | <p class="form-row form-row-wide"> |
||
1097 | <label for="sensei_reg_password"><?php _e( 'Password', 'woothemes-sensei' ); ?> <span class="required">*</span></label> |
||
1098 | <input type="password" class="input-text" name="sensei_reg_password" id="sensei_reg_password" value="<?php if ( ! empty( $_POST['sensei_reg_password'] ) ) esc_attr_e( $_POST['sensei_reg_password'] ); ?>" /> |
||
1099 | </p> |
||
1100 | |||
1101 | <!-- Spam Trap --> |
||
1102 | <div style="left:-999em; position:absolute;"><label for="trap"><?php _e( 'Anti-spam', 'woothemes-sensei' ); ?></label><input type="text" name="email_2" id="trap" tabindex="-1" /></div> |
||
1103 | |||
1104 | <?php do_action( 'sensei_register_form_fields' ); ?> |
||
1105 | <?php do_action( 'register_form' ); ?> |
||
1106 | |||
1107 | <p class="form-row"> |
||
1108 | <input type="submit" class="button" name="register" value="<?php _e( 'Register', 'woothemes-sensei' ); ?>" /> |
||
1109 | </p> |
||
1110 | |||
1111 | <?php do_action( 'sensei_register_form_end' ); ?> |
||
1112 | |||
1113 | </form> |
||
1114 | </div> |
||
1115 | <?php |
||
1116 | } |
||
1117 | ?> |
||
1118 | </div> |
||
1119 | </div> |
||
1120 | |||
1121 | <?php |
||
1122 | } // End sensei_login_form() |
||
1123 | |||
1124 | public function sensei_lesson_meta( $post_id = 0 ) { |
||
1125 | global $post; |
||
1126 | if ( 0 < intval( $post_id ) ) { |
||
1127 | $lesson_course_id = absint( get_post_meta( $post_id, '_lesson_course', true ) ); |
||
1128 | ?><section class="entry"> |
||
1129 | <p class="sensei-course-meta"> |
||
1130 | View Code Duplication | <?php if ( isset( Sensei()->settings->settings[ 'lesson_author' ] ) && ( Sensei()->settings->settings[ 'lesson_author' ] ) ) { ?> |
|
1131 | <span class="course-author"><?php _e( 'by ', 'woothemes-sensei' ); ?><?php the_author_link(); ?></span> |
||
1132 | <?php } ?> |
||
1133 | <?php if ( 0 < intval( $lesson_course_id ) ) { ?> |
||
1134 | <span class="lesson-course"><?php echo ' ' . sprintf( __( 'Part of: %s', 'woothemes-sensei' ), '<a href="' . esc_url( get_permalink( $lesson_course_id ) ) . '" title="' . __( 'View course', 'woothemes-sensei' ) . '"><em>' . get_the_title( $lesson_course_id ) . '</em></a>' ); ?></span> |
||
1135 | <?php } ?> |
||
1136 | </p> |
||
1137 | <p class="lesson-excerpt"><?php the_excerpt( ); ?></p> |
||
1138 | </section><?php |
||
1139 | } // End If Statement |
||
1140 | } // sensei_lesson_meta() |
||
1141 | |||
1142 | public function sensei_lesson_preview_title_text( $course_id ) { |
||
1143 | |||
1144 | $preview_text = __( ' (Preview)', 'woothemes-sensei' ); |
||
1145 | |||
1146 | //if this is a paid course |
||
1147 | if ( Sensei_WC::is_woocommerce_active() ) { |
||
1148 | $wc_post_id = get_post_meta( $course_id, '_course_woocommerce_product', true ); |
||
1149 | if ( 0 < $wc_post_id ) { |
||
1150 | $preview_text = __( ' (Free Preview)', 'woothemes-sensei' ); |
||
1151 | } // End If Statement |
||
1152 | } |
||
1153 | return $preview_text; |
||
1154 | } |
||
1155 | |||
1156 | public function sensei_lesson_preview_title( $title = '', $id = 0 ) { |
||
1157 | global $post, $current_user; |
||
1158 | |||
1159 | // Limit to lessons and check if lesson ID matches filtered post ID |
||
1160 | // @see https://github.com/woothemes/sensei/issues/574 |
||
1161 | if( isset( $post->ID ) && $id == $post->ID && 'lesson' == get_post_type( $post ) ) { |
||
1162 | |||
1163 | // Limit to main query only |
||
1164 | if( is_main_query() ) { |
||
1165 | |||
1166 | // Get the course ID |
||
1167 | $course_id = get_post_meta( $post->ID, '_lesson_course', true ); |
||
1168 | |||
1169 | // Check if the user is taking the course |
||
1170 | if( is_singular( 'lesson' ) && Sensei_Utils::is_preview_lesson( $post->ID ) && ! Sensei_Utils::user_started_course( $course_id, $current_user->ID ) && $post->ID == $id ) { |
||
1171 | $title .= ' ' . $this->sensei_lesson_preview_title_text( $course_id ); |
||
1172 | } |
||
1173 | } |
||
1174 | } |
||
1175 | return $title; |
||
1176 | } // sensei_lesson_preview_title |
||
1177 | |||
1178 | public function sensei_course_start() { |
||
1179 | global $post, $current_user; |
||
1180 | |||
1181 | // Check if the user is taking the course |
||
1182 | $is_user_taking_course = Sensei_Utils::user_started_course( $post->ID, $current_user->ID ); |
||
1183 | // Handle user starting the course |
||
1184 | if ( isset( $_POST['course_start'] ) |
||
1185 | && wp_verify_nonce( $_POST[ 'woothemes_sensei_start_course_noonce' ], 'woothemes_sensei_start_course_noonce' ) |
||
1186 | && !$is_user_taking_course ) { |
||
1187 | |||
1188 | // Start the course |
||
1189 | $activity_logged = Sensei_Utils::user_start_course( $current_user->ID, $post->ID ); |
||
1190 | $this->data = new stdClass(); |
||
1191 | $this->data->is_user_taking_course = false; |
||
1192 | if ( $activity_logged ) { |
||
1193 | $this->data->is_user_taking_course = true; |
||
1194 | |||
1195 | // Refresh page to avoid re-posting |
||
1196 | ?> |
||
1197 | |||
1198 | <script type="text/javascript"> window.location = '<?php echo get_permalink( $post->ID ); ?>'; </script> |
||
1199 | |||
1200 | <?php |
||
1201 | } // End If Statement |
||
1202 | } // End If Statement |
||
1203 | } // End sensei_course_start() |
||
1204 | |||
1205 | /** |
||
1206 | * @deprecated since 1.9.0 |
||
1207 | */ |
||
1208 | public function sensei_course_meta() { |
||
1209 | _deprecated_function( 'Sensei_Frontend::sensei_course_meta', '1.9.0' , 'Sensei_Course::the_course_meta()' ); |
||
1210 | Sensei()->course->the_course_meta( get_post() ); |
||
1211 | } // End sensei_course_meta() |
||
1212 | |||
1213 | /** |
||
1214 | * @deprecated since 1.9.0 |
||
1215 | */ |
||
1216 | public function sensei_course_meta_video() { |
||
1217 | _deprecated_function( 'Sensei_Frontend::sensei_course_meta_video', '1.9.0' , 'Sensei_Course::the_course_video()' ); |
||
1218 | Sensei_Course::the_course_video(); |
||
1219 | } // End sensei_course_meta_video() |
||
1220 | |||
1221 | /** |
||
1222 | * This function shows the WooCommerce cart notice if the user has |
||
1223 | * added the current course to cart. It does not show if the user is already taking |
||
1224 | * the course. |
||
1225 | * |
||
1226 | * @since 1.0.2 |
||
1227 | * @return void; |
||
1228 | */ |
||
1229 | public function sensei_woocommerce_in_cart_message() { |
||
1230 | global $post, $woocommerce; |
||
1231 | |||
1232 | $wc_post_id = absint( get_post_meta( $post->ID, '_course_woocommerce_product', true ) ); |
||
1233 | $user_course_status_id = Sensei_Utils::user_started_course($post->ID , get_current_user_id() ); |
||
1234 | if ( 0 < intval( $wc_post_id ) && ! $user_course_status_id ) { |
||
1235 | |||
1236 | if ( Sensei_WC::is_product_in_cart( $wc_post_id ) ) { |
||
1237 | echo '<div class="sensei-message info">' . sprintf( __('You have already added this Course to your cart. Please %1$s to access the course.', 'woothemes-sensei') . '</div>', '<a class="cart-complete" href="' . $woocommerce->cart->get_checkout_url() . '" title="' . __('complete the purchase', 'woothemes-sensei') . '">' . __('complete the purchase', 'woothemes-sensei') . '</a>' ); |
||
1238 | } // End If Statement |
||
1239 | |||
1240 | } // End If Statement |
||
1241 | |||
1242 | } // End sensei_woocommerce_in_cart_message() |
||
1243 | |||
1244 | // Deprecated |
||
1245 | public function sensei_lesson_comment_count( $count ) { |
||
1246 | return $count; |
||
1247 | } // End sensei_lesson_comment_count() |
||
1248 | |||
1249 | /** |
||
1250 | * Only show excerpts for lessons and courses in search results |
||
1251 | * @param string $content Original content |
||
1252 | * @return string Modified content |
||
1253 | */ |
||
1254 | public function sensei_search_results_excerpt( $content ) { |
||
1255 | global $post; |
||
1256 | |||
1257 | if( is_search() && in_array( $post->post_type, array( 'course', 'lesson' ) ) ) { |
||
1258 | $content = '<p class="course-excerpt">' . the_excerpt( ) . '</p>'; |
||
1259 | } |
||
1260 | |||
1261 | return $content; |
||
1262 | } // End sensei_search_results_excerpt() |
||
1263 | |||
1264 | /** |
||
1265 | * Remove active course when an order is refunded or cancelled |
||
1266 | * @param integer $order_id ID of order |
||
1267 | * @return void |
||
1268 | */ |
||
1269 | public function remove_active_course( $order_id ) { |
||
1270 | $order = new WC_Order( $order_id ); |
||
1271 | |||
1272 | foreach ( $order->get_items() as $item ) { |
||
1273 | if ( isset( $item['variation_id'] ) && ( 0 < $item['variation_id'] ) ) { |
||
1274 | // If item has variation_id then its a variation of the product |
||
1275 | $item_id = $item['variation_id']; |
||
1276 | } else { |
||
1277 | // Than its real product set it's id to item_id |
||
1278 | $item_id = $item['product_id']; |
||
1279 | } |
||
1280 | |||
1281 | if ( $item_id > 0 ) { |
||
1282 | |||
1283 | $user_id = get_post_meta( $order_id, '_customer_user', true ); |
||
1284 | |||
1285 | if( $user_id ) { |
||
1286 | |||
1287 | // Get all courses for product |
||
1288 | $args = array( |
||
1289 | 'posts_per_page' => -1, |
||
1290 | 'post_type' => 'course', |
||
1291 | 'meta_query' => array( |
||
1292 | array( |
||
1293 | 'key' => '_course_woocommerce_product', |
||
1294 | 'value' => $item_id |
||
1295 | ) |
||
1296 | ), |
||
1297 | 'orderby' => 'menu_order date', |
||
1298 | 'order' => 'ASC', |
||
1299 | 'fields' => 'ids', |
||
1300 | ); |
||
1301 | $course_ids = get_posts( $args ); |
||
1302 | |||
1303 | if( $course_ids && count( $course_ids ) > 0 ) { |
||
1304 | foreach( $course_ids as $course_id ) { |
||
1305 | |||
1306 | // Remove all course user meta |
||
1307 | Sensei_Utils::sensei_remove_user_from_course( $course_id, $user_id ); |
||
1308 | |||
1309 | } // End For Loop |
||
1310 | } // End If Statement |
||
1311 | } // End If Statement |
||
1312 | } // End If Statement |
||
1313 | } // End For Loop |
||
1314 | } // End remove_active_course() |
||
1315 | |||
1316 | |||
1317 | /** |
||
1318 | * Activate all purchased courses for user |
||
1319 | * @since 1.4.8 |
||
1320 | * @param integer $user_id User ID |
||
1321 | * @return void |
||
1322 | */ |
||
1323 | public function activate_purchased_courses( $user_id = 0 ) { |
||
1324 | |||
1325 | if( $user_id ) { |
||
1326 | |||
1327 | if( Sensei_WC::is_woocommerce_active() ) { |
||
1328 | |||
1329 | // Get all user's orders |
||
1330 | $order_args = array( |
||
1331 | 'post_type' => 'shop_order', |
||
1332 | 'post_status' => array( 'wc-processing', 'wc-completed' ), |
||
1333 | 'posts_per_page' => -1, |
||
1334 | 'meta_query' => array( |
||
1335 | array( |
||
1336 | 'key' => '_customer_user', |
||
1337 | 'value' => $user_id |
||
1338 | ) |
||
1339 | ), |
||
1340 | ); |
||
1341 | |||
1342 | $orders = get_posts( $order_args ); |
||
1343 | |||
1344 | $product_ids = array(); |
||
1345 | $order_ids = array(); |
||
1346 | |||
1347 | foreach( $orders as $post_id ) { |
||
1348 | |||
1349 | // Only process each order once |
||
1350 | $processed = get_post_meta( $post_id, 'sensei_products_processed', true ); |
||
1351 | |||
1352 | if( $processed && $processed == 'processed' ) { |
||
1353 | continue; |
||
1354 | } |
||
1355 | |||
1356 | // Get course product IDs from order |
||
1357 | $order = new WC_Order( $post_id ); |
||
1358 | |||
1359 | $items = $order->get_items(); |
||
1360 | foreach( $items as $item ) { |
||
1361 | if (isset($item['variation_id']) && $item['variation_id'] > 0) { |
||
1362 | $item_id = $item['variation_id']; |
||
1363 | $product_type = 'variation'; |
||
1364 | } else { |
||
1365 | $item_id = $item['product_id']; |
||
1366 | } |
||
1367 | |||
1368 | $product_ids[] = $item_id; |
||
1369 | } |
||
1370 | |||
1371 | $order_ids[] = $post_id; |
||
1372 | } |
||
1373 | |||
1374 | if( count( $product_ids ) > 0 ) { |
||
1375 | |||
1376 | // Get all courses from user's orders |
||
1377 | $course_args = array( |
||
1378 | 'post_type' => 'course', |
||
1379 | 'posts_per_page' => -1, |
||
1380 | 'meta_query' => array( |
||
1381 | array( |
||
1382 | 'key' => '_course_woocommerce_product', |
||
1383 | 'value' => $product_ids, |
||
1384 | 'compare' => 'IN' |
||
1385 | ) |
||
1386 | ), |
||
1387 | 'orderby' => 'menu_order date', |
||
1388 | 'order' => 'ASC', |
||
1389 | 'fields' => 'ids', |
||
1390 | ); |
||
1391 | $course_ids = get_posts( $course_args ); |
||
1392 | |||
1393 | foreach( $course_ids as $course_id ) { |
||
1394 | |||
1395 | $user_course_status = Sensei_Utils::user_course_status( intval($course_id), $user_id ); |
||
1396 | |||
1397 | // Ignore course if already completed |
||
1398 | if( Sensei_Utils::user_completed_course( $user_course_status ) ) { |
||
1399 | continue; |
||
1400 | } |
||
1401 | |||
1402 | // Ignore course if already started |
||
1403 | if( $user_course_status ) { |
||
1404 | continue; |
||
1405 | } |
||
1406 | |||
1407 | // Mark course as started by user |
||
1408 | Sensei_Utils::user_start_course( $user_id, $course_id ); |
||
1409 | } |
||
1410 | } |
||
1411 | |||
1412 | if( count( $order_ids ) > 0 ) { |
||
1413 | foreach( $order_ids as $order_id ) { |
||
1414 | // Mark order as processed |
||
1415 | update_post_meta( $order_id, 'sensei_products_processed', 'processed' ); |
||
1416 | } |
||
1417 | } |
||
1418 | } |
||
1419 | } |
||
1420 | } // End activate_purchased_courses() |
||
1421 | |||
1422 | /** |
||
1423 | * Activate single course if already purchases |
||
1424 | * @return void |
||
1425 | */ |
||
1426 | public function activate_purchased_single_course() { |
||
1427 | global $post, $current_user; |
||
1428 | |||
1429 | if( Sensei_WC::is_woocommerce_active() ) { |
||
1430 | |||
1431 | if( ! is_user_logged_in() ) return; |
||
1432 | if( ! isset( $post->ID ) ) return; |
||
1433 | |||
1434 | $user_id = $current_user->ID; |
||
1435 | $course_id = $post->ID; |
||
1436 | $course_product_id = (int) get_post_meta( $course_id, '_course_woocommerce_product', true ); |
||
1437 | if( ! $course_product_id ) { |
||
1438 | return; |
||
1439 | } |
||
1440 | |||
1441 | $user_course_status = Sensei_Utils::user_course_status( intval($course_id), $user_id ); |
||
1442 | |||
1443 | // Ignore course if already completed |
||
1444 | if( Sensei_Utils::user_completed_course( $user_course_status ) ) { |
||
1445 | |||
1446 | return; |
||
1447 | } |
||
1448 | |||
1449 | // Ignore course if already started |
||
1450 | if( $user_course_status ) { |
||
1451 | return; |
||
1452 | } |
||
1453 | |||
1454 | // Get all user's orders |
||
1455 | $order_args = array( |
||
1456 | 'post_type' => 'shop_order', |
||
1457 | 'posts_per_page' => -1, |
||
1458 | 'post_status' => array( 'wc-processing', 'wc-completed' ), |
||
1459 | 'meta_query' => array( |
||
1460 | array( |
||
1461 | 'key' => '_customer_user', |
||
1462 | 'value' => $user_id |
||
1463 | ) |
||
1464 | ), |
||
1465 | 'fields' => 'ids', |
||
1466 | ); |
||
1467 | $orders = get_posts( $order_args ); |
||
1468 | |||
1469 | foreach( $orders as $order_post_id ) { |
||
1470 | |||
1471 | // Get course product IDs from order |
||
1472 | $order = new WC_Order( $order_post_id ); |
||
1473 | |||
1474 | $items = $order->get_items(); |
||
1475 | foreach( $items as $item ) { |
||
1476 | |||
1477 | $product = wc_get_product( $item['product_id'] ); |
||
1478 | |||
1479 | // handle product bundles |
||
1480 | if( is_object( $product ) && $product->is_type('bundle') ){ |
||
1481 | |||
1482 | $bundled_product = new WC_Product_Bundle( $product->id ); |
||
1483 | $bundled_items = $bundled_product->get_bundled_items(); |
||
1484 | |||
1485 | foreach( $bundled_items as $bundled_item ){ |
||
1486 | |||
1487 | if( $bundled_item->product_id == $course_product_id ) { |
||
1488 | Sensei_Utils::user_start_course( $user_id, $course_id ); |
||
1489 | return; |
||
1490 | } |
||
1491 | |||
1492 | } |
||
1493 | |||
1494 | } else { |
||
1495 | |||
1496 | // handle regular products |
||
1497 | if( $item['product_id'] == $course_product_id ) { |
||
1498 | Sensei_Utils::user_start_course( $user_id, $course_id ); |
||
1499 | return; |
||
1500 | } |
||
1501 | |||
1502 | } |
||
1503 | } |
||
1504 | } |
||
1505 | |||
1506 | } |
||
1507 | } // End activate_purchased_single_course() |
||
1508 | |||
1509 | /** |
||
1510 | * Hide Sensei activity comments from frontend (requires WordPress 4.0+) |
||
1511 | * @param array $args Default arguments |
||
1512 | * @return array Modified arguments |
||
1513 | */ |
||
1514 | public function hide_sensei_activity( $args = array() ) { |
||
1515 | |||
1516 | if( is_singular( 'lesson' ) || is_singular( 'course' ) ) { |
||
1517 | $args['type'] = 'comment'; |
||
1518 | } |
||
1519 | |||
1520 | return $args; |
||
1521 | } // End hide_sensei_activity() |
||
1522 | |||
1523 | /** |
||
1524 | * Redirect failed login attempts to the front end login page |
||
1525 | * in the case where the login fields are not left empty |
||
1526 | * |
||
1527 | * @return void redirect |
||
1528 | */ |
||
1529 | function sensei_login_fail_redirect( ) { |
||
1530 | |||
1531 | //if not posted from the sensei login form let |
||
1532 | // WordPress or any other party handle the failed request |
||
1533 | if( ! isset( $_REQUEST['form'] ) || 'sensei-login' != $_REQUEST['form'] ){ |
||
1534 | |||
1535 | return ; |
||
1536 | |||
1537 | } |
||
1538 | |||
1539 | // Get the reffering page, where did the post submission come from? |
||
1540 | $referrer = add_query_arg('login', false, $_SERVER['HTTP_REFERER']); |
||
1541 | |||
1542 | // if there's a valid referrer, and it's not the default log-in screen |
||
1543 | if(!empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin')){ |
||
1544 | // let's append some information (login=failed) to the URL for the theme to use |
||
1545 | wp_redirect( esc_url_raw( add_query_arg('login', 'failed', $referrer) ) ); |
||
1546 | exit; |
||
1547 | } |
||
1548 | }// End sensei_login_fail_redirect_to_front_end_login |
||
1549 | |||
1550 | /** |
||
1551 | * Handle the login reques from all sensei intiated login forms. |
||
1552 | * |
||
1553 | * @return void redirect |
||
1554 | */ |
||
1555 | function sensei_handle_login_request( ) { |
||
1556 | |||
1557 | // Check that it is a sensei login request and if it has a valid nonce |
||
1558 | if( isset( $_REQUEST['form'] ) && 'sensei-login' == $_REQUEST['form'] ) { |
||
1559 | |||
1560 | // Validate the login request nonce |
||
1561 | if( !wp_verify_nonce( $_REQUEST['_wpnonce'], 'sensei-login' ) ){ |
||
1562 | return; |
||
1563 | } |
||
1564 | |||
1565 | //get the page where the sensei log form is located |
||
1566 | $referrer = $_REQUEST['_wp_http_referer']; |
||
1567 | //$redirect = $_REQUEST['_sensei_redirect']; |
||
1568 | |||
1569 | if ( ( isset( $_REQUEST['log'] ) && !empty( $_REQUEST['log'] ) ) |
||
1570 | && ( isset( $_REQUEST['pwd'] ) && !empty( $_REQUEST['pwd'] ) ) ){ |
||
1571 | |||
1572 | // when the user has entered a password or username do the sensei login |
||
1573 | $creds = array(); |
||
1574 | |||
1575 | // check if the requests login is an email address |
||
1576 | if( is_email( trim( $_REQUEST['log'] ) ) ){ |
||
1577 | // query wordpress for the users details |
||
1578 | $user = get_user_by( 'email', sanitize_email( $_REQUEST['log'] ) ); |
||
1579 | |||
1580 | // validate the user object |
||
1581 | if( !$user ){ |
||
1582 | |||
1583 | // the email doesnt exist |
||
1584 | wp_redirect( esc_url_raw( add_query_arg('login', 'failed', $referrer) ) ); |
||
1585 | exit; |
||
1586 | |||
1587 | } |
||
1588 | |||
1589 | //assigne the username to the creds array for further processing |
||
1590 | $creds['user_login'] = $user->user_login ; |
||
1591 | |||
1592 | }else{ |
||
1593 | |||
1594 | // process this as a default username login |
||
1595 | $creds['user_login'] = sanitize_text_field( $_REQUEST['log'] ) ; |
||
1596 | |||
1597 | } |
||
1598 | |||
1599 | // get setup the rest of the creds array |
||
1600 | $creds['user_password'] = sanitize_text_field( $_REQUEST['pwd'] ); |
||
1601 | $creds['remember'] = isset( $_REQUEST['rememberme'] ) ? true : false ; |
||
1602 | |||
1603 | //attempt logging in with the given details |
||
1604 | $secure_cookie = is_ssl() ? true : false; |
||
1605 | $user = wp_signon( $creds, $secure_cookie ); |
||
1606 | |||
1607 | if ( is_wp_error($user) ){ // on login failure |
||
1608 | wp_redirect( esc_url_raw( add_query_arg('login', 'failed', $referrer) ) ); |
||
1609 | exit; |
||
1610 | }else{ // on login success |
||
1611 | |||
1612 | /** |
||
1613 | * change the redirect url programatically |
||
1614 | * |
||
1615 | * @since 1.6.1 |
||
1616 | * |
||
1617 | * @param string $referrer the page where the current url wheresensei login form was posted from |
||
1618 | */ |
||
1619 | |||
1620 | $success_redirect_url = apply_filters('sesei_login_success_redirect_url', remove_query_arg( 'login', $referrer ) ); |
||
1621 | |||
1622 | wp_redirect( esc_url_raw( $success_redirect_url ) ); |
||
1623 | exit; |
||
1624 | |||
1625 | } // end is_wp_error($user) |
||
1626 | |||
1627 | }else{ // if username or password is empty |
||
1628 | |||
1629 | wp_redirect( esc_url_raw( add_query_arg('login', 'emptyfields', $referrer) ) ); |
||
1630 | exit; |
||
1631 | |||
1632 | } // end if username $_REQUEST['log'] and password $_REQUEST['pwd'] is empty |
||
1633 | |||
1634 | }elseif( ( isset( $_GET['login'] ) ) ) { |
||
1635 | // else if this request is a redircect from a previously faile login request |
||
1636 | $this->login_message_process(); |
||
1637 | |||
1638 | //exit the handle login request function |
||
1639 | return; |
||
1640 | } |
||
1641 | |||
1642 | // if none of the above |
||
1643 | return; |
||
1644 | |||
1645 | } // End sensei_login_fail_redirect_to_front_end_login |
||
1646 | |||
1647 | /** |
||
1648 | * handle sensei specific registration requests |
||
1649 | * |
||
1650 | * @return void redirect |
||
1651 | * |
||
1652 | */ |
||
1653 | public function sensei_process_registration(){ |
||
1654 | global $current_user; |
||
1655 | // check the for the sensei specific registration requests |
||
1656 | if( !isset( $_POST['sensei_reg_username'] ) && ! isset( $_POST['sensei_reg_email'] ) && !isset( $_POST['sensei_reg_password'] )){ |
||
1657 | // exit if this is not a sensei registration request |
||
1658 | return ; |
||
1659 | } |
||
1660 | // check for spam throw cheating huh |
||
1661 | if( isset( $_POST['email_2'] ) && '' !== $_POST['email_2'] ){ |
||
1662 | $message = 'Error: The spam field should be empty'; |
||
1663 | Sensei()->notices->add_notice( $message, 'alert'); |
||
1664 | return; |
||
1665 | } |
||
1666 | |||
1667 | // retreive form variables |
||
1668 | $new_user_name = sanitize_user( $_POST['sensei_reg_username'] ); |
||
1669 | $new_user_email = $_POST['sensei_reg_email']; |
||
1670 | $new_user_password = $_POST['sensei_reg_password']; |
||
1671 | |||
1672 | // Check the username |
||
1673 | $username_error_notice = ''; |
||
1674 | if ( $new_user_name == '' ) { |
||
1675 | $username_error_notice = __( '<strong>ERROR</strong>: Please enter a username.' ); |
||
1676 | } elseif ( ! validate_username( $new_user_name ) ) { |
||
1677 | $username_error_notice = __( '<strong>ERROR</strong>: This username is invalid because it uses illegal characters. Please enter a valid username.' ); |
||
1678 | } elseif ( username_exists( $new_user_name ) ) { |
||
1679 | $username_error_notice = __( '<strong>ERROR</strong>: This username is already registered. Please choose another one.' ); |
||
1680 | } |
||
1681 | |||
1682 | // exit on username error |
||
1683 | if( '' !== $username_error_notice ){ |
||
1684 | Sensei()->notices->add_notice( $username_error_notice , 'alert'); |
||
1685 | return; |
||
1686 | } |
||
1687 | |||
1688 | // Check the e-mail address |
||
1689 | $email_error_notice = ''; |
||
1690 | if ( $new_user_email == '' ) { |
||
1691 | $email_error_notice = __( '<strong>ERROR</strong>: Please type your e-mail address.' ); |
||
1692 | } elseif ( ! is_email( $new_user_email ) ) { |
||
1693 | $email_error_notice = __( '<strong>ERROR</strong>: The email address isn’t correct.' ); |
||
1694 | } elseif ( email_exists( $new_user_email ) ) { |
||
1695 | $email_error_notice = __( '<strong>ERROR</strong>: This email is already registered, please choose another one.' ); |
||
1696 | } |
||
1697 | |||
1698 | // exit on email address error |
||
1699 | if( '' !== $email_error_notice ){ |
||
1700 | Sensei()->notices->add_notice( $email_error_notice , 'alert'); |
||
1701 | return; |
||
1702 | } |
||
1703 | |||
1704 | //check user password |
||
1705 | |||
1706 | // exit on email address error |
||
1707 | if( empty( $new_user_password ) ){ |
||
1708 | Sensei()->notices->add_notice( __( '<strong>ERROR</strong>: The password field may not be empty, please enter a secure password.' ) , 'alert'); |
||
1709 | return; |
||
1710 | } |
||
1711 | |||
1712 | // register user |
||
1713 | $user_id = wp_create_user( $new_user_name, $new_user_password, $new_user_email ); |
||
1714 | if ( ! $user_id || is_wp_error( $user_id ) ) { |
||
1715 | Sensei()->notices->add_notice( sprintf( __( '<strong>ERROR</strong>: Couldn\'t register you… please contact the <a href="mailto:%s">webmaster</a> !' ), get_option( 'admin_email' ) ), 'alert'); |
||
1716 | } |
||
1717 | |||
1718 | // notify the user |
||
1719 | wp_new_user_notification( $user_id, $new_user_password ); |
||
1720 | |||
1721 | // set global current user aka log the user in |
||
1722 | $current_user = get_user_by( 'id', $user_id ); |
||
1723 | wp_set_auth_cookie( $user_id, true ); |
||
1724 | |||
1725 | // Redirect |
||
1726 | global $wp; |
||
1727 | if ( wp_get_referer() ) { |
||
1728 | $redirect = esc_url( wp_get_referer() ); |
||
1729 | } else { |
||
1730 | $redirect = esc_url( home_url( $wp->request ) ); |
||
1731 | } |
||
1732 | |||
1733 | wp_redirect( apply_filters( 'sensei_registration_redirect', $redirect ) ); |
||
1734 | exit; |
||
1735 | |||
1736 | } // end sensei_process_registration)() |
||
1737 | |||
1738 | /** |
||
1739 | * login_message_process(). handle the login message displayed on faile login |
||
1740 | * |
||
1741 | * @return void redirect |
||
1742 | * @since 1.7.0 |
||
1743 | */ |
||
1744 | public function login_message_process(){ |
||
1745 | |||
1746 | // setup the message variables |
||
1747 | $message = ''; |
||
1748 | |||
1749 | //only output message if the url contains login=failed and login=emptyfields |
||
1750 | |||
1751 | if( $_GET['login'] == 'failed' ){ |
||
1752 | |||
1753 | $message = __('Incorrect login details', 'woothemes-sensei' ); |
||
1754 | |||
1755 | }elseif( $_GET['login'] == 'emptyfields' ){ |
||
1756 | |||
1757 | $message= __('Please enter your username and password', 'woothemes-sensei' ); |
||
1758 | } |
||
1759 | |||
1760 | Sensei()->notices->add_notice( $message, 'alert'); |
||
1761 | |||
1762 | }// end login_message_process |
||
1763 | |||
1764 | |||
1765 | /** |
||
1766 | * sensei_show_admin_bar(). Use WooCommerce filter |
||
1767 | * to show admin bar to Teachers as well. |
||
1768 | * |
||
1769 | * @return void redirect |
||
1770 | * |
||
1771 | */ |
||
1772 | public function sensei_show_admin_bar () { |
||
1773 | |||
1774 | if (current_user_can('edit_courses')) { |
||
1775 | |||
1776 | add_filter( 'woocommerce_disable_admin_bar', '__return_false', 10, 1); |
||
1777 | |||
1778 | } |
||
1779 | |||
1780 | } |
||
1781 | |||
1782 | } // End Class |
||
1783 | |||
1784 | /** |
||
1785 | * Class WooThemes_Sensei_Frontend |
||
1786 | * @ignore only for backward compatibility |
||
1787 | * @since 1.9.0 |
||
1788 | */ |
||
1789 | class WooThemes_Sensei_Frontend extends Sensei_Frontend{} |
||
1790 |
If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:
If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.