PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 2.0.0
Tutor LMS – eLearning and online course solution v2.0.0
4.0.1 4.0.0 3.9.15 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 4 years ago Admin.php 4 years ago Ajax.php 4 years ago Announcements.php 4 years ago Assets.php 4 years ago Backend_Page_Trait.php 4 years ago Course.php 4 years ago Course_Filter.php 4 years ago Course_List.php 4 years ago Course_Settings_Tabs.php 4 years ago Course_Widget.php 4 years ago Custom_Validation.php 5 years ago Dashboard.php 4 years ago FormHandler.php 4 years ago Frontend.php 4 years ago Gutenberg.php 4 years ago Instructor.php 4 years ago Instructors_List.php 4 years ago Lesson.php 4 years ago Options_V2.php 4 years ago Post_types.php 4 years ago Private_Course_Access.php 4 years ago Q_and_A.php 4 years ago Question_Answers_List.php 4 years ago Quiz.php 4 years ago Quiz_Attempts_List.php 4 years ago RestAPI.php 4 years ago Reviews.php 4 years ago Rewrite_Rules.php 4 years ago Shortcode.php 4 years ago Student.php 4 years ago Students_List.php 4 years ago Taxonomies.php 4 years ago Template.php 4 years ago Theme_Compatibility.php 5 years ago Tools.php 4 years ago Tools_V2.php 4 years ago Tutor.php 4 years ago TutorEDD.php 4 years ago Tutor_Base.php 5 years ago Tutor_List_Table.php 4 years ago Tutor_Setup.php 4 years ago Upgrader.php 4 years ago User.php 4 years ago Utils.php 4 years ago Video_Stream.php 4 years ago Withdraw.php 4 years ago Withdraw_Requests_List.php 4 years ago WooCommerce.php 4 years ago
WooCommerce.php
615 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
16 class WooCommerce extends Tutor_Base {
17
18 public function __construct() {
19 parent::__construct();
20
21 // Add option settings
22 add_filter( 'tutor_monetization_options', array( $this, 'tutor_monetization_options' ) );
23
24 $monetize_by = tutor_utils()->get_option( 'monetize_by' );
25 if ( $monetize_by !== 'wc' ) {
26 return;
27 }
28
29 add_filter( 'tutor/options/attr', array( $this, 'add_options' ) );
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 *
68 * @since v.1.3.5
69 */
70 if ( tutor_utils()->has_wc() ) {
71 add_action( 'tutor_course/single/before/inner-wrap', 'wc_print_notices', 10 );
72 add_action( 'tutor_course/single/enrolled/before/inner-wrap', 'wc_print_notices', 10 );
73 }
74
75 /**
76 * Manage WooCommerce plugin dependency
77 *
78 * @since v.1.7.8
79 */
80 $woocommerce_path = dirname( dirname( __DIR__ ) ) . DIRECTORY_SEPARATOR . 'woocommerce' . DIRECTORY_SEPARATOR . 'woocommerce.php';
81 register_deactivation_hook( $woocommerce_path, array( $this, 'disable_tutor_monetization' ) );
82 /**
83 * Redirect student on enrolled courses after course
84 * enrollment complete
85 *
86 * @since 1.9.0
87 */
88 add_action( 'woocommerce_thankyou', array( $this, 'redirect_to_enrolled_courses' ) );
89
90 /**
91 * Change woo commerce cart product link if it is tutor product
92 */
93 add_filter( 'woocommerce_cart_item_permalink', array( $this, 'tutor_update_product_url' ), 10, 2 );
94 add_filter( 'woocommerce_order_item_permalink', array( $this, 'filter_order_item_permalink_callback' ), 10, 3 );
95 }
96 function filter_order_item_permalink_callback( $product_permalink, $item, $order ) {
97
98 // For product variations
99 if ( $item->get_variation_id() > 0 ) {
100 $product = $item->get_product();
101
102 $is_visible = $product && $product->is_visible();
103
104 // Get the instance of the parent variable product Object
105 $parent_product = wc_get_product( $item->get_product_id() );
106
107 // Return the parent product permalink (if product is visible)
108 return $is_visible ? $parent_product->get_permalink() : '';
109 }
110
111 $course_id = $this->get_post_id_by_meta_key_and_value( '_tutor_course_product_id', $item->get_product_id() );
112
113 return get_permalink( $course_id );
114 }
115
116 public function get_post_id_by_meta_key_and_value( $key, $value ) {
117 global $wpdb;
118 $meta = $wpdb->get_results( 'SELECT * FROM `' . $wpdb->postmeta . "` WHERE meta_key='" . esc_sql( $key ) . "' AND meta_value='" . esc_sql( $value ) . "'" );
119 if ( is_array( $meta ) && ! empty( $meta ) && isset( $meta[0] ) ) {
120 $meta = $meta[0];
121 }
122 if ( is_object( $meta ) ) {
123 return $meta->post_id;
124 } else {
125 return false;
126 }
127 }
128
129 public function is_course_purchasable( $bool, $course_id ) {
130 if ( ! tutor_utils()->has_wc() ) {
131 return false;
132 }
133
134 $course_id = tutor_utils()->get_post_id( $course_id );
135 $has_product_id = get_post_meta( $course_id, '_tutor_course_product_id', true );
136 if ( $has_product_id ) {
137 return true;
138 }
139 return false;
140 }
141
142 public function get_tutor_course_price( $price, $course_id ) {
143 $price = null;
144
145 if ( tutor_utils()->is_course_purchasable( $course_id ) ) {
146 if ( tutor_utils()->has_wc() ) {
147 $product_id = tutor_utils()->get_course_product_id( $course_id );
148 $product = wc_get_product( $product_id );
149
150 if ( $product ) {
151 ob_start();
152 ?>
153 <div class="price">
154 <?php echo $product->get_price_html(); ?>
155 </div>
156 <?php
157 return ob_get_clean();
158 }
159 }
160 }
161
162 return $price;
163 }
164
165 public function tutor_course_sell_by() {
166 return 'woocommerce';
167 }
168
169 public function add_tutor_type_in_wc_product( $types ) {
170 $types['tutor_product'] = array(
171 'id' => '_tutor_product',
172 'wrapper_class' => 'show_if_simple',
173 'label' => __( 'For Tutor', 'tutor' ),
174 'description' => __( 'This checkmark ensure that you will sell a specif course via this product.', 'tutor' ),
175 'default' => 'no',
176 );
177
178 return $types;
179 }
180
181 /**
182 * @param $post_ID
183 *
184 * Save course meta for attaching product
185 */
186 public function save_course_meta( $post_ID ) {
187 $product_id = (int) tutor_utils()->avalue_dot( '_tutor_course_product_id', $_POST, 0 );
188
189 if ( $product_id === -1 ) {
190 delete_post_meta( $post_ID, '_tutor_course_product_id' );
191 } elseif ( $product_id ) {
192 update_post_meta( $post_ID, '_tutor_course_product_id', $product_id );
193 // Mark product for woocommerce
194 update_post_meta( $product_id, '_virtual', 'yes' );
195 update_post_meta( $product_id, '_tutor_product', 'yes' );
196 }
197 }
198
199 public function register_meta_box() {
200 add_meta_box( 'tutor-attach-product', __( 'Add Product', 'tutor' ), array( $this, 'course_add_product_metabox' ), $this->course_post_type, 'advanced', 'high' );
201 }
202
203 public function course_add_product_metabox() {
204 include tutor()->path . 'views/metabox/course-add-product-metabox.php';
205 }
206
207 public function save_wc_product_meta( $post_ID ) {
208 $is_tutor_product = sanitize_text_field( tutor_utils()->avalue_dot( '_tutor_product', $_POST ) );
209 if ( $is_tutor_product === 'on' ) {
210 update_post_meta( $post_ID, '_tutor_product', 'yes' );
211 } else {
212 delete_post_meta( $post_ID, '_tutor_product' );
213 }
214 }
215
216 /**
217 *
218 * Take enrolled course action based on order status change
219 */
220 public function enrolled_courses_status_change( $order_id, $status_from, $status_to ) {
221 if ( ! tutor_utils()->is_tutor_order( $order_id ) ) {
222 return;
223 }
224 global $wpdb;
225
226 $enrolled_ids_with_course = $this->get_course_enrolled_ids_by_order_id( $order_id );
227
228 if ( $enrolled_ids_with_course ) {
229 $enrolled_ids = wp_list_pluck( $enrolled_ids_with_course, 'enrolled_id' );
230
231 if ( is_array( $enrolled_ids ) && count( $enrolled_ids ) ) {
232 foreach ( $enrolled_ids as $enrolled_id ) {
233
234 tutor_utils()->course_enrol_status_change( $enrolled_id, $status_to );
235
236 // Invoke enrolled hook
237 if ( $status_to == 'completed' ) {
238 $user_id = get_post_field( 'post_author', $enrolled_id );
239 $course_id = get_post_field( 'post_parent', $enrolled_id );
240 do_action( 'tutor_after_enrolled', $course_id, $user_id, $enrolled_id );
241 }
242 }
243 }
244 }
245 }
246
247 /**
248 * @param $order_id
249 *
250 * @return array|bool
251 */
252 public function get_course_enrolled_ids_by_order_id( $order_id ) {
253 global $wpdb;
254 // Getting all of courses ids within this order
255
256 $courses_ids = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->postmeta} WHERE post_id = %d AND meta_key LIKE '_tutor_order_for_course_id_%' ", $order_id ) );
257
258 if ( is_array( $courses_ids ) && count( $courses_ids ) ) {
259 $course_enrolled_by_order = array();
260 foreach ( $courses_ids as $courses_id ) {
261 $course_id = str_replace( '_tutor_order_for_course_id_', '', $courses_id->meta_key );
262 // array(order_id => array('course_id' => $course_id, 'enrolled_id' => enrolled_id, 'order_id' => $courses_id->post_id))
263 $course_enrolled_by_order[] = array(
264 'course_id' => $course_id,
265 'enrolled_id' => $courses_id->meta_value,
266 'order_id' => $courses_id->post_id,
267 );
268 }
269 return $course_enrolled_by_order;
270 }
271 return false;
272 }
273
274 /**
275 * Remove course
276 *
277 * TODO: right now it's unused
278 */
279 public function remove_active_course( $order_id ) {
280 global $wpdb;
281 // Getting all of courses ids within this order
282
283 $courses_ids = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->postmeta} WHERE post_id = %d meta_key LIKE '_tutor_order_for_course_id_%' ", $order_id ) );
284 }
285
286
287 /**
288 * @param $attr
289 *
290 * @return mixed
291 *
292 * Add option for WooCommerce settings
293 */
294 public function add_options( $attr ) {
295 $attr['monetization']['blocks']['block_options']['fields'][] = array(
296 'key' => 'enable_guest_course_cart',
297 'type' => 'toggle_switch',
298 'label' => __( 'Enable add to cart feature for guest users', 'tutor' ),
299 'label_title' => __( '', 'tutor' ),
300 'default' => 'off',
301 'desc' => __( 'Select a monetization option to generate revenue by selling courses. Supports: WooCommerce, Easy Digital Downloads, Paid Memberships Pro', 'tutor' ),
302 );
303
304 return $attr;
305 }
306
307 /**
308 * @param $arr
309 *
310 * @return mixed
311 *
312 * Returning monetization options
313 *
314 * @since v.1.3.5
315 */
316 public function tutor_monetization_options( $arr ) {
317 $has_wc = tutor_utils()->has_wc();
318 if ( $has_wc ) {
319 $arr['wc'] = __( 'WooCommerce', 'tutor' );
320 }
321 return $arr;
322 }
323
324 /**
325 * @param $item_id
326 * @param $item
327 * @param $order_id
328 *
329 * Adding Earning Data processing WooCommerce
330 *
331 * @since v.1.1.2
332 */
333 public function add_earning_data( $item_id, $item, $order_id ) {
334
335 if ( tutor_utils()->get_option( 'monetize_by' )!='wc' ) {
336 return;
337 }
338
339 global $wpdb;
340 $item = new \WC_Order_Item_Product( $item );
341
342 $product_id = $item->get_product_id();
343 $if_has_course = tutor_utils()->product_belongs_with_course( $product_id );
344
345 if ( $if_has_course ) {
346 $course_id = $if_has_course->post_id;
347 $user_id = $wpdb->get_var( $wpdb->prepare( "SELECT post_author FROM {$wpdb->posts} WHERE ID = %d ", $course_id ) );
348 $order_status = $wpdb->get_var( $wpdb->prepare( "SELECT post_status from {$wpdb->posts} where ID = %d ", $order_id ) );
349
350 /**
351 * Return here if already added this product from this order
352 *
353 * @since v1.9.7
354 */
355 $exist_count = (int) $wpdb->get_var(
356 $wpdb->prepare(
357 "SELECT COUNT(earning_id)
358 FROM {$wpdb->prefix}tutor_earnings
359 WHERE course_id=%d
360 AND order_id=%d
361 AND user_id=%d",
362 $course_id,
363 $order_id,
364 $user_id
365 )
366 );
367
368 if ( $exist_count > 0 ) {
369 return;
370 }
371
372 $total_price = $item->get_total();
373
374 $fees_deduct_data = array();
375 $tutor_earning_fees = tutor_utils()->get_option( 'tutor_earning_fees' );
376 $enable_fees_deducting = tutor_utils()->avalue_dot( 'enable_fees_deducting', $tutor_earning_fees );
377
378 $course_price_grand_total = $total_price;
379
380 if ( $enable_fees_deducting ) {
381 $fees_name = tutor_utils()->avalue_dot( 'fees_name', $tutor_earning_fees );
382 $fees_amount = (int) tutor_utils()->avalue_dot( 'fees_amount', $tutor_earning_fees );
383 $fees_type = tutor_utils()->avalue_dot( 'fees_type', $tutor_earning_fees );
384
385 if ( $fees_amount > 0 ) {
386 if ( $fees_type === 'percent' ) {
387 $fees_amount = ( $total_price * $fees_amount ) / 100;
388 }
389
390 /*
391 if ( $fees_type === 'fixed' ) {
392 $course_price_grand_total = $total_price - $fees_amount;
393 }*/
394
395 $course_price_grand_total = $total_price - $fees_amount;
396 }
397
398 $fees_deduct_data = array(
399 'deduct_fees_amount' => $fees_amount,
400 'deduct_fees_name' => $fees_name,
401 'deduct_fees_type' => $fees_type,
402 );
403 }
404
405 $instructor_rate = tutor_utils()->get_option( 'earning_instructor_commission' );
406 $admin_rate = tutor_utils()->get_option( 'earning_admin_commission' );
407
408 $instructor_amount = 0;
409 if ( $instructor_rate > 0 ) {
410 $instructor_amount = ( $course_price_grand_total * $instructor_rate ) / 100;
411 }
412
413 $admin_amount = 0;
414 if ( $admin_rate > 0 ) {
415 $admin_amount = ( $course_price_grand_total * $admin_rate ) / 100;
416 }
417
418 $commission_type = 'percent';
419
420 // (Use Pro Filter - Start)
421 // The response must be same array structure.
422 // Do not change used variable names here, or change in both of here and pro plugin
423 $pro_arg = array(
424 'user_id' => $user_id,
425 'instructor_rate' => $instructor_rate,
426 'admin_rate' => $admin_rate,
427 'instructor_amount' => $instructor_amount,
428 'admin_amount' => $admin_amount,
429 'course_price_grand_total' => $course_price_grand_total,
430 'commission_type' => $commission_type,
431 );
432 $pro_calculation = apply_filters( 'tutor_pro_earning_calculator', $pro_arg );
433 extract( $pro_calculation );
434 // (Use Pro Filter - End)
435
436 $earning_data = array(
437 'user_id' => $user_id,
438 'course_id' => $course_id,
439 'order_id' => $order_id,
440 'order_status' => $order_status,
441 'course_price_total' => $total_price,
442 'course_price_grand_total' => $course_price_grand_total,
443
444 'instructor_amount' => $instructor_amount,
445 'instructor_rate' => $instructor_rate,
446 'admin_amount' => $admin_amount,
447 'admin_rate' => $admin_rate,
448
449 'commission_type' => $commission_type,
450 'process_by' => 'woocommerce',
451 'created_at' => date( 'Y-m-d H:i:s', tutor_time() ),
452 );
453 $earning_data = apply_filters( 'tutor_new_earning_data', array_merge( $earning_data, $fees_deduct_data ) );
454
455 $wpdb->insert( $wpdb->prefix . 'tutor_earnings', $earning_data );
456 }
457 }
458
459 /**
460 * @param $order_id
461 * @param $status_from
462 * @param $status_to
463 *
464 * Change Earning data status
465 *
466 * @since v.1.1.2
467 */
468 public function add_earning_data_status_change( $order_id, $status_from, $status_to ) {
469 if ( ! tutor_utils()->is_tutor_order( $order_id ) ) {
470 return;
471 }
472 global $wpdb;
473
474 $is_earning_data = (int) $wpdb->get_var( $wpdb->prepare(
475 "SELECT COUNT(earning_id)
476 FROM {$wpdb->prefix}tutor_earnings
477 WHERE order_id = %d ",
478 $order_id
479 ) );
480
481 if ( $is_earning_data ) {
482 $wpdb->update(
483 $wpdb->prefix . 'tutor_earnings',
484 array( 'order_status' => $status_to ),
485 array( 'order_id' => $order_id )
486 );
487 }
488 }
489
490 /**
491 * Course placing order from admin
492 *
493 * @param $order_id
494 * @since v.1.6.7
495 */
496 public function course_placing_order_from_admin( $order_id ) {
497 if ( ! is_admin() ) {
498 return;
499 }
500
501 $order = wc_get_order( $order_id );
502 foreach ( $order->get_items() as $item ) {
503 $product_id = $item->get_product_id();
504 $if_has_course = tutor_utils()->product_belongs_with_course( $product_id );
505 if ( $if_has_course ) {
506 $course_id = $if_has_course->post_id;
507 $customer_id = $order->get_customer_id();
508 tutor_utils()->do_enroll( $course_id, $order_id, $customer_id );
509 }
510 }
511 }
512
513 /**
514 * Course placing order from customer
515 *
516 * @param $order_id
517 * @since v.1.6.7
518 */
519 public function course_placing_order_from_customer( $item_id, $item, $order_id ) {
520 if ( is_admin() ) {
521 return;
522 }
523
524 $item = new \WC_Order_Item_Product( $item );
525 $product_id = $item->get_product_id();
526 $if_has_course = tutor_utils()->product_belongs_with_course( $product_id );
527
528 if ( $if_has_course ) {
529 $course_id = $if_has_course->post_id;
530 tutor_utils()->do_enroll( $course_id, $order_id );
531 }
532 }
533
534 /**
535 * Disable course monetization on woocommerce deactivation
536 *
537 * @since v.1.7.8
538 */
539 public function disable_tutor_monetization() {
540 tutor_utils()->update_option( 'monetize_by', 'free' );
541 update_option( 'tutor_show_woocommerce_notice', true );
542 }
543
544 /**
545 * Redirect student on enrolled courses after course
546 * enrollment complete if course is purchasable
547 *
548 * @param $order_id | int
549 * @since 1.9.0
550 */
551 public function redirect_to_enrolled_courses( $order_id ) {
552 if ( ! tutor_utils()->get_option( 'wc_automatic_order_complete_redirect_to_courses' ) ) {
553 // Since 1.9.1
554 return;
555 }
556
557 // get woo order details
558 $order = wc_get_order( $order_id );
559 $tutor_product = false;
560 $url = tutor_utils()->tutor_dashboard_url() . 'enrolled-courses/';
561
562 foreach ( $order->get_items() as $item ) {
563 $product_id = $item->get_product_id();
564 // check if product associated with tutor course
565 $if_has_course = tutor_utils()->product_belongs_with_course( $product_id );
566 if ( $if_has_course ) {
567 $tutor_product = true;
568 }
569 }
570
571 // if tutor product & order status completed
572 if ( $order->has_status( 'completed' ) && $tutor_product ) {
573 wp_safe_redirect( $url );
574 exit;
575 }
576 }
577
578 /**
579 * Change product url on cart page if product is tutor course
580 *
581 * @since 1.9.8
582 */
583 function tutor_update_product_url( $permalink, $cart_item ) {
584
585 $woo_product_id = $cart_item['product_id'];
586 $product_meta = get_post_meta( $woo_product_id );
587
588 if ( isset( $product_meta['_tutor_product'] ) && $product_meta['_tutor_product'][0] ) {
589
590 global $wpdb;
591 $table = $wpdb->base_prefix . 'postmeta';
592 $post_id = $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM {$table} WHERE meta_key = '_tutor_course_product_id' AND meta_value = %d ", $woo_product_id ) );
593
594 if ( $post_id ) {
595 $data = get_post_permalink( $post_id );
596 return $data;
597 }
598 }
599 }
600 }
601
602
603 add_action(
604 'admin_notices',
605 function() {
606
607 $show = get_option( 'tutor_show_woocommerce_notice' ) && tutor_utils()->get_option( 'monetize_by', 'free' ) == 'free';
608
609 if ( $show ) {
610 $message = __( 'Since WooCommerce is disabled, your monetized courses have been set to free. Please make sure to enable Tutor LMS monetization if you decide to re-enable WooCommerce.', 'tutor' );
611 echo '<div class="notice notice-error"><p>' . $message . '</p></div>';
612 }
613 }
614 );
615