PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 1.2.11
Tutor LMS – eLearning and online course solution v1.2.11
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 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
383 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
97 $product_id = tutor_utils()->get_course_product_id($course_id);
98 $product = wc_get_product( $product_id );
99
100 if ($product) {
101 ob_start();
102 ?>
103 <div class="price">
104 <?php echo $product->get_price_html(); ?>
105 </div>
106 <?php
107 return ob_get_clean();
108 }
109 return false;
110 }
111
112 public function tutor_course_sell_by(){
113 return 'woocommerce';
114 }
115
116 public function add_tutor_type_in_wc_product($types){
117 $types['tutor_product'] = array(
118 'id' => '_tutor_product',
119 'wrapper_class' => 'show_if_simple',
120 'label' => __( 'For Tutor', 'tutor' ),
121 'description' => __( 'This checkmark ensure that you will sell a specif course via this product.', 'tutor' ),
122 'default' => 'no',
123 );
124
125 return $types;
126 }
127
128 public function register_meta_box(){
129 add_meta_box( 'tutor-attach-product', __( 'Add Product', 'tutor' ), array($this, 'course_add_product_metabox'), $this->course_post_type, 'advanced', 'high' );
130 }
131
132 public function course_add_product_metabox(){
133 include tutor()->path.'views/metabox/course-add-product-metabox.php';
134 }
135
136 /**
137 * @param $post_ID
138 *
139 * Save course meta for attaching product
140 */
141 public function save_course_meta($post_ID){
142 $product_id = (int) tutor_utils()->avalue_dot('_tutor_course_product_id', $_POST);
143 if ($product_id){
144 update_post_meta($post_ID, '_tutor_course_product_id', $product_id);
145 //Mark product for woocommerce
146 update_post_meta($product_id, '_virtual', 'yes');
147 update_post_meta($product_id, '_tutor_product', 'yes');
148 }else{
149 delete_post_meta($post_ID, '_tutor_course_product_id');
150 }
151 }
152
153 public function save_wc_product_meta($post_ID){
154 $is_tutor_product = tutor_utils()->avalue_dot('_tutor_product', $_POST);
155 if ($is_tutor_product === 'on'){
156 update_post_meta($post_ID, '_tutor_product', 'yes');
157 }else{
158 delete_post_meta($post_ID, '_tutor_product');
159 }
160 }
161
162 /**
163 * Do something after course order place
164 */
165 public function course_placing_order( $item_id, $item, $order_id){
166 $item = new \WC_Order_Item_Product($item);
167
168 $product_id = $item->get_product_id();
169 $if_has_course = tutor_utils()->product_belongs_with_course($product_id);
170
171 if ($if_has_course){
172 $course_id = $if_has_course->post_id;
173 tutor_utils()->do_enroll($course_id, $order_id);
174 }
175 }
176
177
178 /**
179 *
180 * Take enrolled course action based on order status change
181 */
182
183 public function enrolled_courses_status_change($order_id, $status_from, $status_to){
184 if ( ! tutor_utils()->is_tutor_order($order_id)){
185 return;
186 }
187 global $wpdb;
188
189 $enrolled_ids_with_course = $this->get_course_enrolled_ids_by_order_id($order_id);
190
191 if ($enrolled_ids_with_course){
192 $enrolled_ids = wp_list_pluck($enrolled_ids_with_course, 'enrolled_id');
193
194 if (is_array($enrolled_ids) && count($enrolled_ids)){
195 foreach ($enrolled_ids as $enrolled_id){
196 $wpdb->update( $wpdb->posts, array( 'post_status' => $status_to ), array( 'ID' => $enrolled_id ) );
197 }
198 }
199 }
200 }
201
202 /**
203 * @param $order_id
204 *
205 * @return array|bool
206 */
207 public function get_course_enrolled_ids_by_order_id($order_id){
208 global $wpdb;
209 //Getting all of courses ids within this order
210
211 $courses_ids = $wpdb->get_results("SELECT * FROM {$wpdb->postmeta} WHERE post_id = {$order_id} AND meta_key LIKE '_tutor_order_for_course_id_%' ");
212
213 if (is_array($courses_ids) && count($courses_ids)){
214 $course_enrolled_by_order = array();
215 foreach ($courses_ids as $courses_id){
216 $course_id = str_replace('_tutor_order_for_course_id_', '',$courses_id->meta_key);
217 //array(order_id => array('course_id' => $course_id, 'enrolled_id' => enrolled_id, 'order_id' => $courses_id->post_id))
218 $course_enrolled_by_order[] = array('course_id' => $course_id, 'enrolled_id' => $courses_id->meta_value, 'order_id' => $courses_id->post_id );
219 }
220 return $course_enrolled_by_order;
221 }
222 return false;
223 }
224
225 /**
226 * Remove course
227 *
228 * TODO: right now it's unused
229 */
230 public function remove_active_course($order_id){
231 global $wpdb;
232 //Getting all of courses ids within this order
233
234 $courses_ids = $wpdb->get_results("SELECT * FROM {$wpdb->postmeta} WHERE post_id = {$order_id} meta_key LIKE '_tutor_order_for_course_id_%' ");
235 }
236
237
238 /**
239 * @param $attr
240 *
241 * @return mixed
242 *
243 * Add option for WooCommerce settings
244 */
245 public function add_options($attr){
246
247 $attr['woocommerce'] = array(
248 'label' => __( 'WooCommerce', 'tutor' ),
249
250 'sections' => array(
251 'general' => array(
252 'label' => __('General', 'tutor'),
253 'desc' => __('WooCommerce Settings', 'tutor'),
254 'fields' => array(
255 'enable_course_sell_by_woocommerce' => array(
256 'type' => 'checkbox',
257 'label' => __('Enable / Disable', 'tutor'),
258 'label_title' => __('Enable WooComerce to sell course', 'tutor'),
259 'desc' => __('By integrating WooCommerce, you can sell your course', 'tutor'),
260 ),
261 ),
262 ),
263 ),
264 );
265
266 return $attr;
267 }
268
269 /**
270 * @param $item_id
271 * @param $item
272 * @param $order_id
273 *
274 * Adding Earning Data processing WooCommerce
275 *
276 * @since v.1.1.2
277 */
278 public function add_earning_data( $item_id, $item, $order_id){
279 global $wpdb;
280 $item = new \WC_Order_Item_Product($item);
281
282 $product_id = $item->get_product_id();
283 $if_has_course = tutor_utils()->product_belongs_with_course($product_id);
284
285 if ($if_has_course){
286
287 $enable_tutor_earning = tutor_utils()->get_option('enable_tutor_earning');
288 if ( ! $enable_tutor_earning){
289 return;
290 }
291
292 $course_id = $if_has_course->post_id;
293 $user_id = $wpdb->get_var("SELECT post_author FROM {$wpdb->posts} WHERE ID = {$course_id} ");
294 $order_status = $wpdb->get_var("SELECT post_status from {$wpdb->posts} where ID = {$order_id} ");
295
296 $total_price = $item->get_total();
297
298 $fees_deduct_data = array();
299 $tutor_earning_fees = tutor_utils()->get_option('tutor_earning_fees');
300 $enable_fees_deducting = tutor_utils()->avalue_dot('enable_fees_deducting', $tutor_earning_fees);
301
302 $course_price_grand_total = $total_price;
303
304 if ($enable_fees_deducting){
305 $fees_name = tutor_utils()->avalue_dot('fees_name', $tutor_earning_fees);
306 $fees_amount = tutor_utils()->avalue_dot('fees_amount', $tutor_earning_fees);
307 $fees_type = tutor_utils()->avalue_dot('fees_type', $tutor_earning_fees);
308
309 if ($fees_amount > 0) {
310 if ( $fees_type === 'percent' ) {
311 $course_price_grand_total = ( $total_price * $fees_amount ) / 100;
312 }
313 if ( $fees_type === 'fixed' ) {
314 $course_price_grand_total = $total_price - $fees_amount;
315 }
316 }
317
318 $fees_deduct_data = array(
319 'deduct_fees_amount' => $fees_amount,
320 'deduct_fees_name' => $fees_name,
321 'deduct_fees_type' => $fees_type,
322 );
323 }
324
325 $instructor_rate = tutor_utils()->get_option('earning_instructor_commission');
326 $admin_rate = tutor_utils()->get_option('earning_admin_commission');
327
328 $instructor_amount = 0;
329 if ($instructor_rate > 0){
330 $instructor_amount = ($course_price_grand_total * $instructor_rate) / 100;
331 }
332
333 $admin_amount = 0;
334 if ($admin_rate > 0){
335 $admin_amount = ($course_price_grand_total * $admin_rate) / 100;
336 }
337
338 $earning_data = array(
339 'user_id' => $user_id,
340 'course_id' => $course_id,
341 'order_id' => $order_id,
342 'order_status' => $order_status,
343 'course_price_total' => $total_price,
344 'course_price_grand_total' => $course_price_grand_total,
345
346 'instructor_amount' => $instructor_amount,
347 'instructor_rate' => $instructor_rate,
348 'admin_amount' => $admin_amount,
349 'admin_rate' => $admin_rate,
350
351 'commission_type' => 'percent',
352 'process_by' => 'woocommerce',
353 'created_at' => date( 'Y-m-d H:i:s'),
354 );
355 $earning_data = apply_filters('tutor_new_earning_data', array_merge($earning_data, $fees_deduct_data));
356
357 $wpdb->insert($wpdb->prefix.'tutor_earnings', $earning_data);
358 }
359 }
360
361
362 /**
363 * @param $order_id
364 * @param $status_from
365 * @param $status_to
366 *
367 * Change Earning data status
368 *
369 * @since v.1.1.2
370 */
371 public function add_earning_data_status_change($order_id, $status_from, $status_to){
372 if ( ! tutor_utils()->is_tutor_order($order_id)){
373 return;
374 }
375 global $wpdb;
376
377 $is_earning_data = (int) $wpdb->get_var("SELECT COUNT(earning_id) FROM {$wpdb->prefix}tutor_earnings WHERE order_id = {$order_id} ");
378 if ($is_earning_data){
379 $wpdb->update( $wpdb->prefix.'tutor_earnings', array( 'order_status' => $status_to ), array( 'order_id' => $order_id ) );
380 }
381 }
382
383 }