PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 1.2.20
Tutor LMS – eLearning and online course solution v1.2.20
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 7 years ago Admin.php 7 years ago Ajax.php 7 years ago Assets.php 7 years ago Course.php 7 years ago Gutenberg.php 7 years ago Instructor.php 7 years ago Instructors_List.php 7 years ago Lesson.php 7 years ago Options.php 7 years ago Post_types.php 7 years ago Q_and_A.php 7 years ago Question.php 7 years ago Question_Answers_List.php 7 years ago Quiz.php 7 years ago Quiz_Attempts_List.php 7 years ago Rewrite_Rules.php 7 years ago Shortcode.php 7 years ago Student.php 7 years ago Students_List.php 7 years ago Taxonomies.php 7 years ago Template.php 7 years ago Theme_Compatibility.php 7 years ago Tools.php 7 years ago Tutor.php 7 years ago TutorEDD.php 7 years ago Tutor_Base.php 7 years ago Tutor_List_Table.php 7 years ago User.php 7 years ago Utils.php 7 years ago Video_Stream.php 7 years ago Withdraw.php 7 years ago Withdraw_Requests_List.php 7 years ago WooCommerce.php 7 years ago
WooCommerce.php
389 lines
1 <?php
2 /**
3 * Created by PhpStorm.
4 * User: mhshohel
5 * Date: 1/10/18
6 * Time: 3:01 PM
7 */
8
9 namespace TUTOR;
10
11 class WooCommerce extends Tutor_Base {
12
13 public function __construct() {
14 parent::__construct();
15
16 add_action('tutor_options_before_woocommerce', array($this, 'notice_before_option'));
17
18 //Add option settings
19 add_filter('tutor/options/attr', array($this, 'add_options'));
20
21 $course_sell = tutor_utils()->get_option('enable_course_sell_by_woocommerce');
22 if ( ! $course_sell){
23 return;
24 }
25
26 /**
27 * Is Course Purchasable
28 */
29 add_filter('is_course_purchasable', array($this, 'is_course_purchasable'), 10, 2);
30 add_filter('get_tutor_course_price', array($this, 'get_tutor_course_price'), 10, 2);
31 add_filter('tutor_course_sell_by', array($this, 'tutor_course_sell_by'));
32
33 add_filter('product_type_options', array($this, 'add_tutor_type_in_wc_product'));
34
35 add_action( 'add_meta_boxes', array($this, 'register_meta_box') );
36 add_action('save_post_'.$this->course_post_type, array($this, 'save_course_meta'));
37 add_action('save_post_product', array($this, 'save_wc_product_meta'));
38
39 add_action('tutor_course/single/before/enroll', 'wc_print_notices');
40 add_action('woocommerce_new_order_item', array($this, 'course_placing_order'), 10, 3);
41
42 /**
43 * Order Status Hook
44 *
45 * Remove course from active courses if an order is cancelled or refunded
46 */
47 add_action( 'woocommerce_order_status_changed', array( $this, 'enrolled_courses_status_change' ), 10, 3 );
48
49 /**
50 * Add Earning Data
51 */
52 add_action('woocommerce_new_order_item', array($this, 'add_earning_data'), 10, 3);
53 add_action( 'woocommerce_order_status_changed', array( $this, 'add_earning_data_status_change' ), 10, 3 );
54
55 }
56
57 public function notice_before_option(){
58 $has_wc = tutor_utils()->has_wc();
59 if ($has_wc){
60 return;
61 }
62
63 ob_start();
64 ?>
65 <div class="tutor-notice-warning">
66 <p>
67 <?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
68 WooCommerce plugin installed. Get back on this page after installing the plugin and enable the following feature to start selling
69 courses with Tutor.', 'tutor'); ?>
70 </p>
71 <p><?php _e('This notice will disappear after activating <strong>WooCommerce</strong>', 'tutor'); ?></p>
72 </div>
73 <?php
74 echo ob_get_clean();
75 }
76
77 public function is_course_purchasable($bool, $course_id){
78 if ( ! tutor_utils()->has_wc()){
79 return false;
80 }
81 /*
82 $course_sell = tutor_utils()->get_option('enable_course_sell_by_woocommerce');
83 if ( ! $course_sell){
84 return false;
85 }*/
86
87 $course_id = tutor_utils()->get_post_id($course_id);
88 $has_product_id = get_post_meta($course_id, '_tutor_course_product_id', true);
89 if ($has_product_id){
90 return true;
91 }
92 return false;
93 }
94
95 public function get_tutor_course_price($price, $course_id){
96 $price = null;
97
98 if (tutor_utils()->is_course_purchasable($course_id)) {
99 if (tutor_utils()->has_wc()){
100 $product_id = tutor_utils()->get_course_product_id($course_id);
101 $product = wc_get_product( $product_id );
102
103 if ($product) {
104 ob_start();
105 ?>
106 <div class="price">
107 <?php echo $product->get_price_html(); ?>
108 </div>
109 <?php
110 return ob_get_clean();
111 }
112 }
113 }
114
115 return $price;
116 }
117
118 public function tutor_course_sell_by(){
119 return 'woocommerce';
120 }
121
122 public function add_tutor_type_in_wc_product($types){
123 $types['tutor_product'] = array(
124 'id' => '_tutor_product',
125 'wrapper_class' => 'show_if_simple',
126 'label' => __( 'For Tutor', 'tutor' ),
127 'description' => __( 'This checkmark ensure that you will sell a specif course via this product.', 'tutor' ),
128 'default' => 'no',
129 );
130
131 return $types;
132 }
133
134 public function register_meta_box(){
135 add_meta_box( 'tutor-attach-product', __( 'Add Product', 'tutor' ), array($this, 'course_add_product_metabox'), $this->course_post_type, 'advanced', 'high' );
136 }
137
138 public function course_add_product_metabox(){
139 include tutor()->path.'views/metabox/course-add-product-metabox.php';
140 }
141
142 /**
143 * @param $post_ID
144 *
145 * Save course meta for attaching product
146 */
147 public function save_course_meta($post_ID){
148 $product_id = (int) tutor_utils()->avalue_dot('_tutor_course_product_id', $_POST);
149 if ($product_id){
150 update_post_meta($post_ID, '_tutor_course_product_id', $product_id);
151 //Mark product for woocommerce
152 update_post_meta($product_id, '_virtual', 'yes');
153 update_post_meta($product_id, '_tutor_product', 'yes');
154 }else{
155 delete_post_meta($post_ID, '_tutor_course_product_id');
156 }
157 }
158
159 public function save_wc_product_meta($post_ID){
160 $is_tutor_product = tutor_utils()->avalue_dot('_tutor_product', $_POST);
161 if ($is_tutor_product === 'on'){
162 update_post_meta($post_ID, '_tutor_product', 'yes');
163 }else{
164 delete_post_meta($post_ID, '_tutor_product');
165 }
166 }
167
168 /**
169 * Do something after course order place
170 */
171 public function course_placing_order( $item_id, $item, $order_id){
172 $item = new \WC_Order_Item_Product($item);
173
174 $product_id = $item->get_product_id();
175 $if_has_course = tutor_utils()->product_belongs_with_course($product_id);
176
177 if ($if_has_course){
178 $course_id = $if_has_course->post_id;
179 tutor_utils()->do_enroll($course_id, $order_id);
180 }
181 }
182
183
184 /**
185 *
186 * Take enrolled course action based on order status change
187 */
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 $wpdb->update( $wpdb->posts, array( 'post_status' => $status_to ), array( 'ID' => $enrolled_id ) );
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 ),
268 ),
269 ),
270 );
271
272 return $attr;
273 }
274
275 /**
276 * @param $item_id
277 * @param $item
278 * @param $order_id
279 *
280 * Adding Earning Data processing WooCommerce
281 *
282 * @since v.1.1.2
283 */
284 public function add_earning_data( $item_id, $item, $order_id){
285 global $wpdb;
286 $item = new \WC_Order_Item_Product($item);
287
288 $product_id = $item->get_product_id();
289 $if_has_course = tutor_utils()->product_belongs_with_course($product_id);
290
291 if ($if_has_course){
292
293 $enable_tutor_earning = tutor_utils()->get_option('enable_tutor_earning');
294 if ( ! $enable_tutor_earning){
295 return;
296 }
297
298 $course_id = $if_has_course->post_id;
299 $user_id = $wpdb->get_var("SELECT post_author FROM {$wpdb->posts} WHERE ID = {$course_id} ");
300 $order_status = $wpdb->get_var("SELECT post_status from {$wpdb->posts} where ID = {$order_id} ");
301
302 $total_price = $item->get_total();
303
304 $fees_deduct_data = array();
305 $tutor_earning_fees = tutor_utils()->get_option('tutor_earning_fees');
306 $enable_fees_deducting = tutor_utils()->avalue_dot('enable_fees_deducting', $tutor_earning_fees);
307
308 $course_price_grand_total = $total_price;
309
310 if ($enable_fees_deducting){
311 $fees_name = tutor_utils()->avalue_dot('fees_name', $tutor_earning_fees);
312 $fees_amount = tutor_utils()->avalue_dot('fees_amount', $tutor_earning_fees);
313 $fees_type = tutor_utils()->avalue_dot('fees_type', $tutor_earning_fees);
314
315 if ($fees_amount > 0) {
316 if ( $fees_type === 'percent' ) {
317 $course_price_grand_total = ( $total_price * $fees_amount ) / 100;
318 }
319 if ( $fees_type === 'fixed' ) {
320 $course_price_grand_total = $total_price - $fees_amount;
321 }
322 }
323
324 $fees_deduct_data = array(
325 'deduct_fees_amount' => $fees_amount,
326 'deduct_fees_name' => $fees_name,
327 'deduct_fees_type' => $fees_type,
328 );
329 }
330
331 $instructor_rate = tutor_utils()->get_option('earning_instructor_commission');
332 $admin_rate = tutor_utils()->get_option('earning_admin_commission');
333
334 $instructor_amount = 0;
335 if ($instructor_rate > 0){
336 $instructor_amount = ($course_price_grand_total * $instructor_rate) / 100;
337 }
338
339 $admin_amount = 0;
340 if ($admin_rate > 0){
341 $admin_amount = ($course_price_grand_total * $admin_rate) / 100;
342 }
343
344 $earning_data = array(
345 'user_id' => $user_id,
346 'course_id' => $course_id,
347 'order_id' => $order_id,
348 'order_status' => $order_status,
349 'course_price_total' => $total_price,
350 'course_price_grand_total' => $course_price_grand_total,
351
352 'instructor_amount' => $instructor_amount,
353 'instructor_rate' => $instructor_rate,
354 'admin_amount' => $admin_amount,
355 'admin_rate' => $admin_rate,
356
357 'commission_type' => 'percent',
358 'process_by' => 'woocommerce',
359 'created_at' => date( 'Y-m-d H:i:s'),
360 );
361 $earning_data = apply_filters('tutor_new_earning_data', array_merge($earning_data, $fees_deduct_data));
362
363 $wpdb->insert($wpdb->prefix.'tutor_earnings', $earning_data);
364 }
365 }
366
367
368 /**
369 * @param $order_id
370 * @param $status_from
371 * @param $status_to
372 *
373 * Change Earning data status
374 *
375 * @since v.1.1.2
376 */
377 public function add_earning_data_status_change($order_id, $status_from, $status_to){
378 if ( ! tutor_utils()->is_tutor_order($order_id)){
379 return;
380 }
381 global $wpdb;
382
383 $is_earning_data = (int) $wpdb->get_var("SELECT COUNT(earning_id) FROM {$wpdb->prefix}tutor_earnings WHERE order_id = {$order_id} ");
384 if ($is_earning_data){
385 $wpdb->update( $wpdb->prefix.'tutor_earnings', array( 'order_status' => $status_to ), array( 'order_id' => $order_id ) );
386 }
387 }
388
389 }