Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
Complex classes like Sensei_Frontend often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use Sensei_Frontend, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
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 ) { |
||
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( ) { |
||
610 | |||
611 | /** |
||
612 | * @deprecated since 1.9.0 |
||
613 | */ |
||
614 | public function 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 ) { |
||
866 | |||
867 | /** |
||
868 | * |
||
869 | */ |
||
870 | public function 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() ) ){ |
||
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 ); |
||
925 | |||
926 | public function sensei_reset_lesson_button() { |
||
956 | |||
957 | /** |
||
958 | * @deprecated since 1.9.0 |
||
959 | */ |
||
960 | public function sensei_lesson_quiz_meta( ) { |
||
965 | |||
966 | public function sensei_course_archive_meta() { |
||
993 | |||
994 | /** |
||
995 | * @deprecated since 1.9.0 |
||
996 | */ |
||
997 | public function sensei_single_main_content() { |
||
1000 | |||
1001 | /** |
||
1002 | * @deprecated since 1.9.0 |
||
1003 | */ |
||
1004 | public function sensei_lesson_archive_main_content() { |
||
1007 | |||
1008 | /** |
||
1009 | * @deprecated since 1.9.0 |
||
1010 | */ |
||
1011 | public function sensei_message_archive_main_content() { |
||
1014 | |||
1015 | /** |
||
1016 | * @deprecated since 1.9.0 |
||
1017 | */ |
||
1018 | public function sensei_no_permissions_main_content() { |
||
1021 | |||
1022 | public function sensei_course_category_main_content() { |
||
1057 | |||
1058 | public function sensei_login_form() { |
||
1123 | |||
1124 | public function sensei_lesson_meta( $post_id = 0 ) { |
||
1141 | |||
1142 | public function sensei_lesson_preview_title_text( $course_id ) { |
||
1155 | |||
1156 | public function sensei_lesson_preview_title( $title = '', $id = 0 ) { |
||
1177 | |||
1178 | public function sensei_course_start() { |
||
1204 | |||
1205 | /** |
||
1206 | * @deprecated since 1.9.0 |
||
1207 | */ |
||
1208 | public function sensei_course_meta() { |
||
1212 | |||
1213 | /** |
||
1214 | * @deprecated since 1.9.0 |
||
1215 | */ |
||
1216 | public function 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() { |
||
1243 | |||
1244 | // Deprecated |
||
1245 | public function sensei_lesson_comment_count( $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 ) { |
||
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 ) { |
||
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 ) { |
||
1421 | |||
1422 | /** |
||
1423 | * Activate single course if already purchases |
||
1424 | * @return void |
||
1425 | */ |
||
1426 | public function 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() ) { |
||
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( ) { |
||
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( ) { |
||
1646 | |||
1647 | /** |
||
1648 | * handle sensei specific registration requests |
||
1649 | * |
||
1650 | * @return void redirect |
||
1651 | * |
||
1652 | */ |
||
1653 | public function 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(){ |
||
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 () { |
||
1781 | |||
1782 | } // End Class |
||
1783 | |||
1790 |
The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.
The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.
To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.