1: <?php
2: if ( ! defined( 'ABSPATH' ) ) exit;
3:
4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
15: class WooThemes_Sensei_Course_Component_Widget extends WP_Widget {
16: protected $woo_widget_cssclass;
17: protected $woo_widget_description;
18: protected $woo_widget_idbase;
19: protected $woo_widget_title;
20: protected $instance;
21:
22: 23: 24: 25:
26: public function __construct() {
27:
28: $this->woo_widget_cssclass = 'widget_sensei_course_component';
29: $this->woo_widget_description = __( 'This widget will output a list of Courses - New, Featured, Free, Paid, Active, Completed.', 'woothemes-sensei' );
30: $this->woo_widget_idbase = 'sensei_course_component';
31: $this->woo_widget_title = __( 'Sensei - Course Component', 'woothemes-sensei' );
32:
33: $this->woo_widget_componentslist = array(
34: 'usercourses' => __( 'New Courses', 'woothemes-sensei' ),
35: 'featuredcourses' => __( 'Featured Courses', 'woothemes-sensei' ),
36: 'activecourses' => __( 'My Active Courses', 'woothemes-sensei' ),
37: 'completedcourses' => __( 'My Completed Courses', 'woothemes-sensei' ),
38: );
39:
40:
41: if ( Sensei_WC::is_woocommerce_active() ) {
42: $this->woo_widget_componentslist['freecourses'] = __( 'Free Courses', 'woothemes-sensei' );
43: $this->woo_widget_componentslist['paidcourses'] = __( 'Paid Courses', 'woothemes-sensei' );
44: }
45:
46:
47: $widget_ops = array( 'classname' => $this->woo_widget_cssclass, 'description' => $this->woo_widget_description );
48:
49:
50: $control_ops = array( 'width' => 250, 'height' => 350, 'id_base' => $this->woo_widget_idbase );
51:
52:
53: parent::__construct( $this->woo_widget_idbase, $this->woo_widget_title, $widget_ops, $control_ops );
54: }
55:
56: 57: 58: 59: 60: 61: 62:
63: public function widget( $args, $instance ) {
64:
65: remove_filter( 'pre_get_posts', 'sensei_course_archive_filter', 10, 1 );
66:
67:
68: if ( ! in_array( $instance['component'], array_keys( $this->woo_widget_componentslist ) )
69: || ( ! is_user_logged_in() && ( 'activecourses' == $instance['component'] || 'completedcourses' == $instance['component'] ) ) ) {
70:
71: return;
72:
73: }
74:
75: $this->instance = $instance;
76:
77:
78: $title = apply_filters('widget_title', $instance['title'], $instance, $this->id_base );
79:
80:
81: echo $args['before_widget'];
82:
83:
84: if ( $title ) { echo $args['before_title'] . $title . $args['after_title']; }
85:
86:
87:
88: do_action( $this->woo_widget_cssclass . '_top' );
89:
90: if ( in_array( $instance['component'], array_keys( $this->woo_widget_componentslist ) ) ) {
91: $this->load_component( $instance );
92: }
93:
94:
95: do_action( $this->woo_widget_cssclass . '_bottom' );
96:
97:
98: echo $args['after_widget'];
99:
100:
101: add_filter( 'pre_get_posts', 'sensei_course_archive_filter', 10, 1 );
102:
103: }
104:
105: 106: 107: 108: 109: 110: 111:
112: public function update ( $new_instance, $old_instance ) {
113: $instance = $old_instance;
114:
115:
116: $instance['title'] = strip_tags( $new_instance['title'] );
117:
118:
119: $instance['component'] = esc_attr( $new_instance['component'] );
120:
121:
122: $instance['limit'] = esc_attr( $new_instance['limit'] );
123:
124:
125: return $instance;
126: }
127:
128: 129: 130: 131: 132: 133: 134:
135: public function form( $instance ) {
136:
137:
138:
139: $defaults = array(
140: 'title' => '',
141: 'component' => '',
142: 'limit' => 3
143: );
144:
145: $instance = wp_parse_args( (array) $instance, $defaults );
146: ?>
147: <!-- Widget Title: Text Input -->
148: <p>
149: <label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php _e( 'Title (optional):', 'woothemes-sensei' ); ?></label>
150: <input type="text" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" value="<?php echo esc_attr( $instance['title'] ); ?>" class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>" />
151: </p>
152: <!-- Widget Component: Select Input -->
153: <p>
154: <label for="<?php echo esc_attr( $this->get_field_id( 'component' ) ); ?>"><?php _e( 'Component:', 'woothemes-sensei' ); ?></label>
155: <select name="<?php echo esc_attr( $this->get_field_name( 'component' ) ); ?>" class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'component' ) ); ?>">
156: <?php foreach ( $this->woo_widget_componentslist as $k => $v ) { ?>
157: <option value="<?php echo esc_attr( $k ); ?>"<?php selected( $instance['component'], $k ); ?>><?php echo $v; ?></option>
158: <?php } ?>
159: </select>
160: </p>
161: <!-- Widget Limit: Text Input -->
162: <p>
163: <label for="<?php echo esc_attr( $this->get_field_id( 'limit' ) ); ?>"><?php _e( 'Number of Courses (optional):', 'woothemes-sensei' ); ?></label>
164: <input type="text" name="<?php echo esc_attr( $this->get_field_name( 'limit' ) ); ?>" value="<?php echo esc_attr( $instance['limit'] ); ?>" class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'limit' ) ); ?>" />
165: </p>
166:
167: <?php
168: }
169:
170: 171: 172: 173: 174: 175: 176: 177:
178: protected function load_component ( $instance ) {
179:
180: $courses = array();
181:
182: if ( 'usercourses' == esc_attr( $instance['component'] ) ) {
183:
184: $courses = $this->get_new_courses( );
185:
186: } elseif ( 'activecourses' == esc_attr( $instance['component'] ) ) {
187:
188: $courses = $this->get_active_courses( );
189:
190:
191: } elseif ( 'completedcourses' == esc_attr( $instance['component'] ) ) {
192:
193: $courses = $this->get_completed_courses();
194:
195: } elseif ( 'featuredcourses' == esc_attr( $instance['component'] ) ) {
196:
197: $courses = $this->get_featured_courses();
198:
199: } elseif ( 'paidcourses' == esc_attr( $instance['component'] ) ) {
200:
201: $args = array( 'posts_per_page' => $this->instance['limit'] );
202: $courses = Sensei_WC::get_paid_courses( $args );
203:
204: } elseif ( 'freecourses' == esc_attr( $instance['component'] ) ) {
205:
206: $args = array( 'posts_per_page' => $this->instance['limit'] );
207: $courses = Sensei_WC::get_free_courses( $args );
208:
209: } else {
210:
211: return;
212:
213: }
214:
215:
216: if ( !empty($instance['limit']) && intval( $instance['limit'] ) >= 1 && intval( $instance['limit'] ) < count($courses) ) {
217:
218: $courses = array_slice( $courses, 0, intval( $instance['limit'] ) );
219:
220: }
221:
222: if ( empty( $courses ) && $instance['limit'] != 0 ) {
223:
224: $this->display_no_courses_message();
225: return;
226:
227: }
228:
229: $this->display_courses( $courses );
230:
231: }
232:
233:
234: 235: 236: 237: 238: 239:
240: public function display_no_courses_message ( ) {
241:
242: if ( 'featuredcourses' == $this->instance['component'] ) {
243:
244: _e( 'You have no featured courses.', 'woothemes-sensei' );
245:
246: } elseif ( 'activecourses' == $this->instance['component'] ) {
247:
248: _e( 'You have no active courses.', 'woothemes-sensei' );
249:
250: } elseif ( 'completedcourses' == $this->instance['component'] ) {
251:
252: _e( 'You have no completed courses.', 'woothemes-sensei' );
253:
254: }else{
255:
256: _e( 'You have no courses.', 'woothemes-sensei' );
257:
258: }
259: }
260:
261: 262: 263: 264: 265: 266:
267: public function display_courses( $courses = array() ){ ?>
268: <ul>
269: <?php
270:
271: foreach ($courses as $course) {
272:
273: $post_id = absint( $course->ID );
274: $post_title = $course->post_title;
275: $user_info = get_userdata( absint( $course->post_author ) );
276: $author_link = get_author_posts_url( absint( $course->post_author ) );
277: $author_display_name = $user_info->display_name;
278: $author_id = $course->post_author;
279: ?>
280:
281: <li class="fix">
282:
283: <?php do_action( 'sensei_course_image', $post_id ); ?>
284:
285: <a href="<?php echo esc_url( get_permalink( $post_id ) ); ?>"
286: title="<?php echo esc_attr( $post_title ); ?>">
287:
288: <?php echo $post_title; ?>
289:
290: </a>
291: <br />
292:
293: <?php if ( isset( Sensei()->settings->settings[ 'course_author' ] ) && ( Sensei()->settings->settings[ 'course_author' ] ) ) { ?>
294: <span class="course-author">
295: <?php _e( 'by ', 'woothemes-sensei' ); ?>
296: <a href="<?php echo esc_url( $author_link ); ?>" title="<?php echo esc_attr( $author_display_name ); ?>">
297: <?php echo esc_html( $author_display_name ); ?>
298: </a>
299: </span>
300: <br />
301: <?php }
302:
303: <span class="course-lesson-count">
304: <?php echo Sensei()->course->course_lesson_count( $post_id ) . ' ' . __( 'Lessons', 'woothemes-sensei' ); ?>
305: </span>
306:
307: <br />
308:
309: <?php sensei_simple_course_price( $post_id ); ?>
310:
311: </li>
312:
313: <?php
314: }
315:
316: if ( 'activecourses' == esc_attr( $this->instance['component'] ) || 'completedcourses' == esc_attr( $this->instance['component'] ) ) {
317: $my_account_page_id = intval( Sensei()->settings->settings[ 'my_course_page' ] );
318: echo '<li class="my-account fix"><a href="'. esc_url( get_permalink( $my_account_page_id ) ) .'">'
319: .__('My Courses', 'woothemes-sensei')
320: .'<span class="meta-nav"></span></a></li>';
321: }
322:
323: ?>
324: </ul>
325:
326: <?php }
327:
328: 329: 330: 331: 332:
333: public function get_default_query_args(){
334:
335: return array(
336: 'post_type' => 'course',
337: 'orderby' => 'date',
338: 'order' => 'DESC',
339: 'post_status' => 'publish',
340: 'posts_per_page' => $this->instance['limit'],
341: 'suppress_filters' => 0,
342: );
343:
344: }
345:
346: 347: 348: 349: 350: 351:
352: public function get_new_courses ( ) {
353:
354: return get_posts( $this->get_default_query_args( ) );
355:
356: }
357:
358: 359: 360: 361: 362: 363:
364: public function get_active_courses ( ) {
365:
366: $courses = array();
367: $activity_args = array( 'user_id' => get_current_user_id(), 'type' => 'sensei_course_status', 'status' => 'in-progress' );
368: $user_courses_activity = Sensei_Utils::sensei_check_for_activity( $activity_args, true );
369:
370: if ( ! is_array( $user_courses_activity ) ) {
371:
372: $user_courses_activity_arr[] = $user_courses_activity;
373: $user_courses_activity = $user_courses_activity_arr;
374:
375: }
376:
377: foreach( $user_courses_activity AS $activity ) {
378: $courses[] = get_post( $activity->comment_post_ID );
379: }
380:
381: return $courses;
382:
383: }
384:
385: 386: 387: 388: 389: 390:
391: public function get_completed_courses ( ) {
392:
393: $courses = array();
394: $activity_args = array( 'user_id' => get_current_user_id(), 'type' => 'sensei_course_status', 'status' => 'complete' );
395:
396: $user_courses_activity = Sensei_Utils::sensei_check_for_activity( $activity_args , true );
397:
398: if ( ! is_array( $user_courses_activity ) ) {
399:
400: $user_courses_activity_arr[] = $user_courses_activity;
401: $user_courses_activity = $user_courses_activity_arr;
402:
403: }
404:
405: foreach( $user_courses_activity AS $activity ) {
406:
407: if( isset( $activity->comment_post_ID ) ){
408:
409: $courses[] = get_post( $activity->comment_post_ID );
410:
411: }
412:
413: }
414: return $courses;
415: }
416:
417: 418: 419: 420: 421: 422:
423: public function get_featured_courses ( ) {
424:
425: $query_args = $this->get_default_query_args();
426: $query_args[ 'meta_key' ] = '_course_featured';
427: $query_args[ 'meta_value' ] = 'featured';
428: $query_args[ 'meta_compare' ] = '=';
429:
430: return get_posts( $query_args );
431:
432: }
433: }