PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 1.6.9
Tutor LMS – eLearning and online course solution v1.6.9
3.9.14 3.9.13 3.9.12 3.9.11 trunk 1.0.0 1.0.0-alpha 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.2.0 1.2.1 1.2.11 1.2.12 1.2.13 1.2.20 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6 1.7.7 1.7.8 1.7.9 1.8.0 1.8.1 1.8.10 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.15 1.9.16 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.10 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.1.1 2.1.10 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.3.0 2.4.0 2.5.0 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 3.0.0 3.0.1 3.0.2 3.1.0 3.2.0 3.2.1 3.2.2 3.2.3 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.7.0 3.7.1 3.7.2 3.7.3 3.7.4 3.8.0 3.8.1 3.8.2 3.8.3 3.9.0 3.9.1 3.9.10 3.9.2 3.9.3 3.9.4 3.9.5 3.9.6 3.9.7 3.9.8 3.9.9
tutor / classes / WooCommerce.php
tutor / classes Last commit date
Addons.php 5 years ago Admin.php 5 years ago Ajax.php 5 years ago Assets.php 5 years ago Course.php 5 years ago Course_Settings_Tabs.php 5 years ago Course_Widget.php 5 years ago Dashboard.php 5 years ago Email.php 5 years ago FormHandler.php 5 years ago Frontend.php 5 years ago Gutenberg.php 5 years ago Instructor.php 5 years ago Instructors_List.php 5 years ago Lesson.php 5 years ago Options.php 5 years ago Post_types.php 5 years ago Q_and_A.php 5 years ago Question_Answers_List.php 5 years ago Quiz.php 5 years ago Quiz_Attempts_List.php 5 years ago RestAPI.php 5 years ago Rewrite_Rules.php 5 years ago Shortcode.php 5 years ago Student.php 5 years ago Students_List.php 5 years ago Taxonomies.php 5 years ago Template.php 5 years ago Theme_Compatibility.php 5 years ago Tools.php 5 years ago Tutor.php 5 years ago TutorEDD.php 5 years ago Tutor_Base.php 5 years ago Tutor_List_Table.php 5 years ago Tutor_Setup.php 5 years ago Upgrader.php 5 years ago User.php 5 years ago Utils.php 5 years ago Video_Stream.php 5 years ago Withdraw.php 5 years ago Withdraw_Requests_List.php 5 years ago WooCommerce.php 5 years ago
WooCommerce.php
459 lines
1 <?php
2
3 /**
4 * Created by PhpStorm.
5 * User: themeum
6 * Date: 1/10/18
7 * Time: 3:01 PM
8 */
9
10 namespace TUTOR;
11
12 if (!defined('ABSPATH'))
13 exit;
14
15 class WooCommerce extends Tutor_Base {
16
17 public function __construct() {
18 parent::__construct();
19
20 add_action('tutor_options_before_woocommerce', array($this, 'notice_before_option'));
21
22 //Add option settings
23 add_filter('tutor_monetization_options', array($this, 'tutor_monetization_options'));
24 add_filter('tutor/options/attr', array($this, 'add_options'));
25
26 $monetize_by = tutils()->get_option('monetize_by');
27 if ($monetize_by !== 'wc') {
28 return;
29 }
30
31 /**
32 * Is Course Purchasable
33 */
34 add_filter('is_course_purchasable', array($this, 'is_course_purchasable'), 10, 2);
35 add_filter('get_tutor_course_price', array($this, 'get_tutor_course_price'), 10, 2);
36 add_filter('tutor_course_sell_by', array($this, 'tutor_course_sell_by'));
37
38 add_filter('product_type_options', array($this, 'add_tutor_type_in_wc_product'));
39
40 add_action('add_meta_boxes', array($this, 'register_meta_box'));
41 add_action('save_post_' . $this->course_post_type, array($this, 'save_course_meta'));
42 add_action('save_post_product', array($this, 'save_wc_product_meta'));
43
44 add_action('tutor_course/single/before/enroll', 'wc_print_notices');
45
46 /**
47 * After place new order
48 */
49 add_action('woocommerce_new_order', array($this, 'course_placing_order_from_admin'), 10, 3);
50 add_action('woocommerce_new_order_item', array($this, 'course_placing_order_from_customer'), 10, 3);
51
52 /**
53 * Order Status Hook
54 *
55 * Remove course from active courses if an order is cancelled or refunded
56 */
57 add_action('woocommerce_order_status_changed', array($this, 'enrolled_courses_status_change'), 10, 3);
58
59 /**
60 * Add Earning Data
61 */
62 add_action('woocommerce_new_order_item', array($this, 'add_earning_data'), 10, 3);
63 add_action('woocommerce_order_status_changed', array($this, 'add_earning_data_status_change'), 10, 3);
64
65 /**
66 * WC Print Notices After Enroll
67 * @since v.1.3.5
68 */
69 if (tutils()->has_wc()) {
70 add_action('tutor_course/single/before/inner-wrap', 'wc_print_notices', 10);
71 add_action('tutor_course/single/enrolled/before/inner-wrap', 'wc_print_notices', 10);
72 }
73 }
74
75 public function notice_before_option() {
76 $has_wc = tutor_utils()->has_wc();
77 if ($has_wc) {
78 return;
79 }
80
81 ob_start();
82 ?>
83 <div class="tutor-notice-warning">
84 <p>
85 <?php _e(' Seems like you don’t have WooCommerce plugin installed on your site. In order to use this functionality, you need to have the
86 WooCommerce plugin installed. Get back on this page after installing the plugin and enable the following feature to start selling
87 courses with Tutor.', 'tutor'); ?>
88 </p>
89 <p><?php _e('This notice will disappear after activating <strong>WooCommerce</strong>', 'tutor'); ?></p>
90 </div>
91 <?php
92 echo ob_get_clean();
93 }
94
95 public function is_course_purchasable($bool, $course_id) {
96 if (!tutor_utils()->has_wc()) {
97 return false;
98 }
99
100 $course_id = tutor_utils()->get_post_id($course_id);
101 $has_product_id = get_post_meta($course_id, '_tutor_course_product_id', true);
102 if ($has_product_id) {
103 return true;
104 }
105 return false;
106 }
107
108 public function get_tutor_course_price($price, $course_id) {
109 $price = null;
110
111 if (tutor_utils()->is_course_purchasable($course_id)) {
112 if (tutor_utils()->has_wc()) {
113 $product_id = tutor_utils()->get_course_product_id($course_id);
114 $product = wc_get_product($product_id);
115
116 if ($product) {
117 ob_start();
118 ?>
119 <div class="price">
120 <?php echo $product->get_price_html(); ?>
121 </div>
122 <?php
123 return ob_get_clean();
124 }
125 }
126 }
127
128 return $price;
129 }
130
131 public function tutor_course_sell_by() {
132 return 'woocommerce';
133 }
134
135 public function add_tutor_type_in_wc_product($types) {
136 $types['tutor_product'] = array(
137 'id' => '_tutor_product',
138 'wrapper_class' => 'show_if_simple',
139 'label' => __('For Tutor', 'tutor'),
140 'description' => __('This checkmark ensure that you will sell a specif course via this product.', 'tutor'),
141 'default' => 'no',
142 );
143
144 return $types;
145 }
146
147 public function register_meta_box() {
148 add_meta_box('tutor-attach-product', __('Add Product', 'tutor'), array($this, 'course_add_product_metabox'), $this->course_post_type, 'advanced', 'high');
149 }
150
151 public function course_add_product_metabox() {
152 include tutor()->path . 'views/metabox/course-add-product-metabox.php';
153 }
154
155 /**
156 * @param $post_ID
157 *
158 * Save course meta for attaching product
159 */
160 public function save_course_meta($post_ID) {
161 $product_id = tutor_utils()->avalue_dot('_tutor_course_product_id', $_POST);
162
163 if ($product_id === '-1') {
164 delete_post_meta($post_ID, '_tutor_course_product_id');
165 } else {
166 $product_id = (int) $product_id;
167 if ($product_id) {
168 update_post_meta($post_ID, '_tutor_course_product_id', $product_id);
169 //Mark product for woocommerce
170 update_post_meta($product_id, '_virtual', 'yes');
171 update_post_meta($product_id, '_tutor_product', 'yes');
172 }
173 }
174 }
175
176 public function save_wc_product_meta($post_ID) {
177 $is_tutor_product = tutor_utils()->avalue_dot('_tutor_product', $_POST);
178 if ($is_tutor_product === 'on') {
179 update_post_meta($post_ID, '_tutor_product', 'yes');
180 } else {
181 delete_post_meta($post_ID, '_tutor_product');
182 }
183 }
184
185 /**
186 *
187 * Take enrolled course action based on order status change
188 */
189 public function enrolled_courses_status_change($order_id, $status_from, $status_to) {
190 if (!tutor_utils()->is_tutor_order($order_id)) {
191 return;
192 }
193 global $wpdb;
194
195 $enrolled_ids_with_course = $this->get_course_enrolled_ids_by_order_id($order_id);
196
197 if ($enrolled_ids_with_course) {
198 $enrolled_ids = wp_list_pluck($enrolled_ids_with_course, 'enrolled_id');
199
200 if (is_array($enrolled_ids) && count($enrolled_ids)) {
201 foreach ($enrolled_ids as $enrolled_id) {
202 tutils()->course_enrol_status_change($enrolled_id, $status_to);
203 }
204 }
205 }
206 }
207
208 /**
209 * @param $order_id
210 *
211 * @return array|bool
212 */
213 public function get_course_enrolled_ids_by_order_id($order_id) {
214 global $wpdb;
215 //Getting all of courses ids within this order
216
217 $courses_ids = $wpdb->get_results("SELECT * FROM {$wpdb->postmeta} WHERE post_id = {$order_id} AND meta_key LIKE '_tutor_order_for_course_id_%' ");
218
219 if (is_array($courses_ids) && count($courses_ids)) {
220 $course_enrolled_by_order = array();
221 foreach ($courses_ids as $courses_id) {
222 $course_id = str_replace('_tutor_order_for_course_id_', '', $courses_id->meta_key);
223 //array(order_id => array('course_id' => $course_id, 'enrolled_id' => enrolled_id, 'order_id' => $courses_id->post_id))
224 $course_enrolled_by_order[] = array('course_id' => $course_id, 'enrolled_id' => $courses_id->meta_value, 'order_id' => $courses_id->post_id);
225 }
226 return $course_enrolled_by_order;
227 }
228 return false;
229 }
230
231 /**
232 * Remove course
233 *
234 * TODO: right now it's unused
235 */
236 public function remove_active_course($order_id) {
237 global $wpdb;
238 //Getting all of courses ids within this order
239
240 $courses_ids = $wpdb->get_results("SELECT * FROM {$wpdb->postmeta} WHERE post_id = {$order_id} meta_key LIKE '_tutor_order_for_course_id_%' ");
241 }
242
243
244 /**
245 * @param $attr
246 *
247 * @return mixed
248 *
249 * Add option for WooCommerce settings
250 */
251 public function add_options($attr) {
252
253 $attr['woocommerce'] = array(
254 'label' => __('WooCommerce', 'tutor'),
255
256 'sections' => array(
257 'general' => array(
258 'label' => __('General', 'tutor'),
259 'desc' => __('WooCommerce Settings', 'tutor'),
260 'fields' => array(
261 /*'enable_course_sell_by_woocommerce' => array(
262 'type' => 'checkbox',
263 'label' => __('Enable / Disable', 'tutor'),
264 'label_title' => __('Enable WooComerce to sell course', 'tutor'),
265 'desc' => __('By integrating WooCommerce, you can sell your course', 'tutor'),
266 ),*/
267 'enable_guest_course_cart' => array(
268 'type' => 'checkbox',
269 'label' => __('Enable / Disable', 'tutor'),
270 'label_title' => __('Enable add to cart feature for guest users', 'tutor'),
271 'desc' => __('Enabling this will let an unregistered user purchase any course from the Course Details page. Head over to Documentation to know how to configure this setting.', 'tutor'),
272 ),
273 ),
274 ),
275 ),
276 );
277
278 return $attr;
279 }
280
281 /**
282 * @param $arr
283 *
284 * @return mixed
285 *
286 * Returning monetization options
287 *
288 * @since v.1.3.5
289 */
290 public function tutor_monetization_options($arr) {
291 $has_wc = tutils()->has_wc();
292 if ($has_wc) {
293 $arr['wc'] = __('WooCommerce', 'tutor');
294 }
295 return $arr;
296 }
297
298 /**
299 * @param $item_id
300 * @param $item
301 * @param $order_id
302 *
303 * Adding Earning Data processing WooCommerce
304 *
305 * @since v.1.1.2
306 */
307 public function add_earning_data($item_id, $item, $order_id) {
308 global $wpdb;
309 $item = new \WC_Order_Item_Product($item);
310
311 $product_id = $item->get_product_id();
312 $if_has_course = tutor_utils()->product_belongs_with_course($product_id);
313
314 if ($if_has_course) {
315
316 $enable_tutor_earning = tutor_utils()->get_option('enable_tutor_earning');
317 if (!$enable_tutor_earning) {
318 return;
319 }
320
321 $course_id = $if_has_course->post_id;
322 $user_id = $wpdb->get_var("SELECT post_author FROM {$wpdb->posts} WHERE ID = {$course_id} ");
323 $order_status = $wpdb->get_var("SELECT post_status from {$wpdb->posts} where ID = {$order_id} ");
324
325 $total_price = $item->get_total();
326
327 $fees_deduct_data = array();
328 $tutor_earning_fees = tutor_utils()->get_option('tutor_earning_fees');
329 $enable_fees_deducting = tutor_utils()->avalue_dot('enable_fees_deducting', $tutor_earning_fees);
330
331 $course_price_grand_total = $total_price;
332
333 if ($enable_fees_deducting) {
334 $fees_name = tutor_utils()->avalue_dot('fees_name', $tutor_earning_fees);
335 $fees_amount = (int) tutor_utils()->avalue_dot('fees_amount', $tutor_earning_fees);
336 $fees_type = tutor_utils()->avalue_dot('fees_type', $tutor_earning_fees);
337
338 if ($fees_amount > 0) {
339 if ($fees_type === 'percent') {
340 $fees_amount = ($total_price * $fees_amount) / 100;
341 }
342
343 /*
344 if ( $fees_type === 'fixed' ) {
345 $course_price_grand_total = $total_price - $fees_amount;
346 }*/
347
348 $course_price_grand_total = $total_price - $fees_amount;
349 }
350
351 $fees_deduct_data = array(
352 'deduct_fees_amount' => $fees_amount,
353 'deduct_fees_name' => $fees_name,
354 'deduct_fees_type' => $fees_type,
355 );
356 }
357
358 $instructor_rate = tutor_utils()->get_option('earning_instructor_commission');
359 $admin_rate = tutor_utils()->get_option('earning_admin_commission');
360
361 $instructor_amount = 0;
362 if ($instructor_rate > 0) {
363 $instructor_amount = ($course_price_grand_total * $instructor_rate) / 100;
364 }
365
366 $admin_amount = 0;
367 if ($admin_rate > 0) {
368 $admin_amount = ($course_price_grand_total * $admin_rate) / 100;
369 }
370
371 $earning_data = array(
372 'user_id' => $user_id,
373 'course_id' => $course_id,
374 'order_id' => $order_id,
375 'order_status' => $order_status,
376 'course_price_total' => $total_price,
377 'course_price_grand_total' => $course_price_grand_total,
378
379 'instructor_amount' => $instructor_amount,
380 'instructor_rate' => $instructor_rate,
381 'admin_amount' => $admin_amount,
382 'admin_rate' => $admin_rate,
383
384 'commission_type' => 'percent',
385 'process_by' => 'woocommerce',
386 'created_at' => date('Y-m-d H:i:s', tutor_time()),
387 );
388 $earning_data = apply_filters('tutor_new_earning_data', array_merge($earning_data, $fees_deduct_data));
389
390 $wpdb->insert($wpdb->prefix . 'tutor_earnings', $earning_data);
391 }
392 }
393
394 /**
395 * @param $order_id
396 * @param $status_from
397 * @param $status_to
398 *
399 * Change Earning data status
400 *
401 * @since v.1.1.2
402 */
403 public function add_earning_data_status_change($order_id, $status_from, $status_to) {
404 if (!tutor_utils()->is_tutor_order($order_id)) {
405 return;
406 }
407 global $wpdb;
408
409 $is_earning_data = (int) $wpdb->get_var("SELECT COUNT(earning_id) FROM {$wpdb->prefix}tutor_earnings WHERE order_id = {$order_id} ");
410 if ($is_earning_data) {
411 $wpdb->update($wpdb->prefix . 'tutor_earnings', array('order_status' => $status_to), array('order_id' => $order_id));
412 }
413 }
414
415 /**
416 * Course placing order from admin
417 *
418 * @param $order_id
419 * @since v.1.6.7
420 */
421 public function course_placing_order_from_admin($order_id) {
422 if (!is_admin()) {
423 return;
424 }
425
426 $order = wc_get_order( $order_id );
427 foreach ($order->get_items() as $item) {
428 $product_id = $item->get_product_id();
429 $if_has_course = tutor_utils()->product_belongs_with_course($product_id);
430 if ($if_has_course) {
431 $course_id = $if_has_course->post_id;
432 $customer_id = $order->get_customer_id();
433 tutor_utils()->do_enroll($course_id, $order_id, $customer_id);
434 }
435 }
436 }
437
438 /**
439 * Course placing order from customer
440 *
441 * @param $order_id
442 * @since v.1.6.7
443 */
444 public function course_placing_order_from_customer($item_id, $item, $order_id) {
445 if (is_admin()) {
446 return;
447 }
448
449 $item = new \WC_Order_Item_Product($item);
450 $product_id = $item->get_product_id();
451 $if_has_course = tutor_utils()->product_belongs_with_course($product_id);
452
453 if ($if_has_course){
454 $course_id = $if_has_course->post_id;
455 tutor_utils()->do_enroll($course_id, $order_id);
456 }
457 }
458 }
459