Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
Complex classes like Sensei_WC often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use Sensei_WC, and based on these observations, apply Extract Interface, too.
| 1 | <?php |
||
| 14 | Class Sensei_WC{ |
||
| 15 | /** |
||
| 16 | * Load the files needed for the woocommerce integration. |
||
| 17 | * |
||
| 18 | * @since 1.9.0 |
||
| 19 | */ |
||
| 20 | public static function load_woocommerce_integration_hooks(){ |
||
| 21 | |||
| 22 | require_once( __DIR__ . '/hooks/woocommerce.php' ); |
||
| 23 | |||
| 24 | } |
||
| 25 | /** |
||
| 26 | * check if WooCommerce plugin is loaded and allowed by Sensei |
||
| 27 | * |
||
| 28 | * @since 1.9.0 |
||
| 29 | * @return bool |
||
| 30 | */ |
||
| 31 | public static function is_woocommerce_active(){ |
||
| 32 | |||
| 33 | $is_woocommerce_enabled_in_settings = isset( Sensei()->settings->settings['woocommerce_enabled'] ) && Sensei()->settings->settings['woocommerce_enabled']; |
||
| 34 | return self::is_woocommerce_present() && $is_woocommerce_enabled_in_settings; |
||
| 35 | |||
| 36 | } // end is_woocommerce_active |
||
| 37 | |||
| 38 | /** |
||
| 39 | * Checks if the WooCommerce plugin is installed and activation. |
||
| 40 | * |
||
| 41 | * If you need to check if WooCommerce is activated use Sensei_Utils::is_woocommerce_active(). |
||
| 42 | * This function does nott check to see if the Sensei setting for WooCommerce is enabled. |
||
| 43 | * |
||
| 44 | * @since 1.9.0 |
||
| 45 | * |
||
| 46 | * @return bool |
||
| 47 | */ |
||
| 48 | public static function is_woocommerce_present(){ |
||
| 63 | |||
| 64 | /** |
||
| 65 | * Find the order active number (completed or processing ) for a given user on a course. It will return the latest order. |
||
| 66 | * |
||
| 67 | * If multiple exist we will return the latest order. |
||
| 68 | * |
||
| 69 | * @param $user_id |
||
| 70 | * @param $course_id |
||
| 71 | * @return array $user_course_orders |
||
| 72 | */ |
||
| 73 | public static function get_learner_course_active_order_id( $user_id, $course_id ){ |
||
| 74 | |||
| 75 | $course_product_id = get_post_meta( $course_id, '_course_woocommerce_product', true ); |
||
| 76 | |||
| 77 | $orders_query = new WP_Query( array( |
||
| 78 | 'post_type' => 'shop_order', |
||
| 79 | 'posts_per_page' => -1, |
||
| 80 | 'post_status' => array( 'wc-processing', 'wc-completed' ), |
||
| 81 | 'meta_key'=> '_customer_user', |
||
| 82 | 'meta_value'=> $user_id, |
||
| 83 | ) ); |
||
| 84 | |||
| 85 | if( $orders_query->post_count == 0 ){ |
||
| 86 | |||
| 87 | return false; |
||
|
|
|||
| 88 | |||
| 89 | } |
||
| 90 | |||
| 91 | foreach( $orders_query->get_posts() as $order ){ |
||
| 92 | |||
| 93 | $order = new WC_Order( $order->ID ); |
||
| 94 | $items = $order->get_items(); |
||
| 95 | |||
| 96 | $user_orders = array(); |
||
| 97 | |||
| 98 | foreach( $items as $item ){ |
||
| 99 | |||
| 100 | // if the product id on the order and the one given to this function |
||
| 101 | // this order has been placed by the given user on the given course. |
||
| 102 | $product = wc_get_product( $item['product_id'] ); |
||
| 103 | |||
| 104 | if ( $product->is_type( 'variable' )) { |
||
| 105 | |||
| 106 | $item_product_id = $item['variation_id']; |
||
| 107 | |||
| 108 | } else { |
||
| 109 | |||
| 110 | $item_product_id = $item['product_id']; |
||
| 111 | |||
| 112 | } |
||
| 113 | |||
| 114 | if( $course_product_id == $item_product_id ){ |
||
| 115 | |||
| 116 | return $order->id; |
||
| 117 | |||
| 118 | } |
||
| 119 | |||
| 120 | |||
| 121 | }//end for each order item |
||
| 122 | |||
| 123 | } // end for each order |
||
| 124 | |||
| 125 | // if we reach this place we found no order |
||
| 126 | return false; |
||
| 127 | |||
| 128 | } // end get_learner_course_active_order_ids |
||
| 129 | |||
| 130 | /** |
||
| 131 | * Output WooCommerce specific course filters |
||
| 132 | * Removing the paged argument |
||
| 133 | * |
||
| 134 | * @since 1.9.0 |
||
| 135 | * @param $filter_links |
||
| 136 | * @return mixed |
||
| 137 | */ |
||
| 138 | public static function add_course_archive_wc_filter_links( $filter_links ){ |
||
| 139 | |||
| 140 | $free_courses = self::get_free_courses(); |
||
| 141 | $paid_courses = self::get_paid_courses(); |
||
| 142 | |||
| 143 | if ( empty( $free_courses ) || empty( $paid_courses ) ){ |
||
| 144 | // do not show any WooCommerce filters if all courses are |
||
| 145 | // free or if all courses are paid |
||
| 146 | return $filter_links; |
||
| 147 | |||
| 148 | } |
||
| 149 | |||
| 150 | $filter_links[] = array( |
||
| 151 | 'id'=>'paid' , |
||
| 152 | 'url'=> add_query_arg( array( 'course_filter'=>'paid'), Sensei_Course::get_courses_page_url() ), |
||
| 153 | 'title'=>__( 'Paid', 'woothemes-sensei' ) |
||
| 154 | ); |
||
| 155 | |||
| 156 | $filter_links[] = array( |
||
| 157 | 'id'=>'free', |
||
| 158 | 'url'=> add_query_arg( array( 'course_filter'=>'free'), Sensei_Course::get_courses_page_url() ), |
||
| 159 | 'title'=>__( 'Free', 'woothemes-sensei' ) |
||
| 160 | ); |
||
| 161 | |||
| 162 | return $filter_links; |
||
| 163 | |||
| 164 | }// end add_course_archive_wc_filter_links |
||
| 165 | |||
| 166 | /** |
||
| 167 | * Apply the free filter the the course query |
||
| 168 | * getting all course with no products or products with zero price |
||
| 169 | * |
||
| 170 | * hooked into pre_get_posts |
||
| 171 | * |
||
| 172 | * @since 1.9.0 |
||
| 173 | * @param WP_Query $query |
||
| 174 | * @return WP_Query $query |
||
| 175 | */ |
||
| 176 | public static function course_archive_wc_filter_free( $query ){ |
||
| 177 | |||
| 178 | if( isset( $_GET['course_filter'] ) && 'free' == $_GET['course_filter'] |
||
| 179 | && 'course' == $query->get( 'post_type') && $query->is_main_query() ){ |
||
| 180 | |||
| 181 | // setup the course meta query |
||
| 182 | $meta_query = self::get_free_courses_meta_query_args(); |
||
| 183 | |||
| 184 | // manipulate the query to return free courses |
||
| 185 | $query->set('meta_query', $meta_query ); |
||
| 186 | |||
| 187 | // don't show any paid courses |
||
| 188 | $courses = self::get_paid_courses(); |
||
| 189 | $ids = array(); |
||
| 190 | foreach( $courses as $course ){ |
||
| 191 | $ids[] = $course->ID; |
||
| 192 | } |
||
| 193 | $query->set( 'post__not_in', $ids ); |
||
| 194 | |||
| 195 | }// end if course_filter |
||
| 196 | |||
| 197 | return $query; |
||
| 198 | |||
| 199 | }// course_archive_wc_filter_free |
||
| 200 | |||
| 201 | /** |
||
| 202 | * Apply the paid filter to the course query on the courses page |
||
| 203 | * will include all course with a product attached with a price |
||
| 204 | * more than 0 |
||
| 205 | * |
||
| 206 | * hooked into pre_get_posts |
||
| 207 | * |
||
| 208 | * @since 1.9.0 |
||
| 209 | * @param WP_Query $query |
||
| 210 | * @return WP_Query $query |
||
| 211 | */ |
||
| 212 | public static function course_archive_wc_filter_paid( $query ){ |
||
| 213 | |||
| 214 | if( isset( $_GET['course_filter'] ) && 'paid' == $_GET['course_filter'] |
||
| 215 | && 'course' == $query->get( 'post_type') && $query->is_main_query() ){ |
||
| 216 | |||
| 217 | // setup the course meta query |
||
| 218 | $meta_query = self::get_paid_courses_meta_query_args(); |
||
| 219 | |||
| 220 | // manipulate the query to return free courses |
||
| 221 | $query->set('meta_query', $meta_query ); |
||
| 222 | |||
| 223 | } |
||
| 224 | |||
| 225 | return $query; |
||
| 226 | |||
| 227 | } |
||
| 228 | |||
| 229 | /** |
||
| 230 | * Load the WooCommerce single product actions above |
||
| 231 | * single courses if woocommerce is active allowing purchase |
||
| 232 | * information and actions to be hooked from WooCommerce. |
||
| 233 | */ |
||
| 234 | public static function do_single_course_wc_single_product_action(){ |
||
| 235 | |||
| 236 | /** |
||
| 237 | * this hooks is documented within the WooCommerce plugin. |
||
| 238 | */ |
||
| 239 | if ( Sensei_WC::is_woocommerce_active() ) { |
||
| 240 | |||
| 241 | do_action( 'woocommerce_before_single_product' ); |
||
| 242 | |||
| 243 | } // End If Statement |
||
| 244 | |||
| 245 | }// end do_single_course_wc_single_product_action |
||
| 246 | |||
| 247 | /** |
||
| 248 | * Hooking into the single lesson page to alter the |
||
| 249 | * user access permissions based on if they have purchased the |
||
| 250 | * course the lesson belongs to. |
||
| 251 | * |
||
| 252 | * This function will only return false or the passed in user_access value. |
||
| 253 | * It doesn't return true in order to avoid altering other options. |
||
| 254 | * |
||
| 255 | * @since 1.9.0 |
||
| 256 | * |
||
| 257 | * @param $can_user_view_lesson |
||
| 258 | * @param $lesson_id |
||
| 259 | * @param $user_id |
||
| 260 | * @return bool |
||
| 261 | */ |
||
| 262 | public static function alter_can_user_view_lesson ( $can_user_view_lesson, $lesson_id, $user_id ){ |
||
| 263 | |||
| 264 | // check if the course has a valid product attached to it |
||
| 265 | // which the user should have purchased if they want to access |
||
| 266 | // the current lesson |
||
| 267 | $course_id = get_post_meta( $lesson_id , '_lesson_course', true); |
||
| 268 | $wc_post_id = get_post_meta( $course_id, '_course_woocommerce_product', true ); |
||
| 269 | $product = Sensei()->sensei_get_woocommerce_product_object($wc_post_id); |
||
| 270 | if( isset ($product) && is_object($product) ){ |
||
| 271 | |||
| 272 | // valid product found |
||
| 273 | $order_id = self::get_learner_course_active_order_id( $user_id, $course_id ); |
||
| 274 | |||
| 275 | // product has a successful order so this user may access the content |
||
| 276 | // this function may only return false or the default |
||
| 277 | // returning true may override other negatives which we don't want |
||
| 278 | if( ! $order_id ){ |
||
| 279 | |||
| 280 | return false; |
||
| 281 | |||
| 282 | } |
||
| 283 | |||
| 284 | } |
||
| 285 | |||
| 286 | // return the passed in value |
||
| 287 | return $can_user_view_lesson; |
||
| 288 | |||
| 289 | } |
||
| 290 | |||
| 291 | /** |
||
| 292 | * Add course link to order thank you and details pages. |
||
| 293 | * |
||
| 294 | * @since 1.4.5 |
||
| 295 | * @access public |
||
| 296 | * |
||
| 297 | * @return void |
||
| 298 | */ |
||
| 299 | public static function course_link_from_order( ) { |
||
| 300 | |||
| 301 | if( ! is_order_received_page() ){ |
||
| 302 | return; |
||
| 303 | } |
||
| 304 | |||
| 305 | $order_id = get_query_var( 'order-received' ); |
||
| 306 | $order = new WC_Order( $order_id ); |
||
| 307 | |||
| 308 | // exit early if not wc-completed or wc-processing |
||
| 309 | if( 'wc-completed' != $order->post_status |
||
| 310 | && 'wc-processing' != $order->post_status ) { |
||
| 311 | return; |
||
| 312 | } |
||
| 313 | |||
| 314 | $course_links = array(); // store the for links for courses purchased |
||
| 315 | foreach ( $order->get_items() as $item ) { |
||
| 316 | |||
| 317 | if ( isset( $item['variation_id'] ) && ( 0 < $item['variation_id'] ) ) { |
||
| 318 | |||
| 319 | // If item has variation_id then its a variation of the product |
||
| 320 | $item_id = $item['variation_id']; |
||
| 321 | |||
| 322 | } else { |
||
| 323 | |||
| 324 | //If not its real product set its id to item_id |
||
| 325 | $item_id = $item['product_id']; |
||
| 326 | |||
| 327 | } // End If Statement |
||
| 328 | |||
| 329 | $user_id = get_post_meta( $order->id, '_customer_user', true ); |
||
| 330 | |||
| 331 | if( $user_id ) { |
||
| 332 | |||
| 333 | // Get all courses for product |
||
| 334 | $args = Sensei_Course::get_default_query_args(); |
||
| 335 | $args['meta_query'] = array( array( |
||
| 336 | 'key' => '_course_woocommerce_product', |
||
| 337 | 'value' => $item_id |
||
| 338 | ) ); |
||
| 339 | $args['orderby'] = 'menu_order date'; |
||
| 340 | $args['order'] = 'ASC'; |
||
| 341 | |||
| 342 | // loop through courses |
||
| 343 | $courses = get_posts( $args ); |
||
| 344 | if( $courses && count( $courses ) > 0 ) { |
||
| 345 | |||
| 346 | foreach( $courses as $course ) { |
||
| 347 | |||
| 348 | $title = $course->post_title; |
||
| 349 | $permalink = get_permalink( $course->ID ); |
||
| 350 | $course_links[] .= '<a href="' . esc_url( $permalink ) . '" >' . $title . '</a> '; |
||
| 351 | |||
| 352 | } // end for each |
||
| 353 | |||
| 354 | // close the message div |
||
| 355 | |||
| 356 | }// end if $courses check |
||
| 357 | } |
||
| 358 | }// end loop through orders |
||
| 359 | |||
| 360 | // add the courses to the WooCommerce notice |
||
| 361 | if( ! empty( $course_links) ){ |
||
| 362 | |||
| 363 | $courses_html = _nx( |
||
| 364 | 'You have purchased the following course:', |
||
| 365 | 'You have purchased the following courses:', |
||
| 366 | count( $course_links ), |
||
| 367 | 'Purchase thank you note on Checkout page. The course link(s) will be show', 'woothemes-sensei' |
||
| 368 | ); |
||
| 369 | |||
| 370 | foreach( $course_links as $link ){ |
||
| 371 | |||
| 372 | $courses_html .= '<li>' . $link . '</li>'; |
||
| 373 | |||
| 374 | } |
||
| 375 | |||
| 376 | $courses_html .= ' </ul>'; |
||
| 377 | |||
| 378 | wc_add_notice( $courses_html, 'success' ); |
||
| 379 | } |
||
| 380 | |||
| 381 | } // end course_link_order_form |
||
| 382 | |||
| 383 | /** |
||
| 384 | * Show the message that a user should complete |
||
| 385 | * their purchase if the course is in the cart |
||
| 386 | * |
||
| 387 | * This should be used within the course loop or single course page |
||
| 388 | * |
||
| 389 | * @since 1.9.0 |
||
| 390 | */ |
||
| 391 | public static function course_in_cart_message(){ |
||
| 392 | |||
| 393 | global $post; |
||
| 394 | |||
| 395 | View Code Duplication | if( self::is_course_in_cart( $post->ID ) ){ ?> |
|
| 396 | |||
| 397 | <div class="sensei-message info"> |
||
| 398 | <?php |
||
| 399 | |||
| 400 | $cart_link = '<a class="cart-complete" href="' . WC()->cart->get_checkout_url() |
||
| 401 | . '" title="' . __('complete purchase', 'woothemes-sensei') . '">' |
||
| 402 | . __('complete the purchase', 'woothemes-sensei') . '</a>'; |
||
| 403 | |||
| 404 | echo sprintf( __('You have already added this Course to your cart. Please %1$s to access the course.', 'woothemes-sensei'), $cart_link ); |
||
| 405 | |||
| 406 | ?> |
||
| 407 | </div> |
||
| 408 | <?php } |
||
| 409 | |||
| 410 | } // End sensei_woocommerce_in_cart_message() |
||
| 411 | |||
| 412 | /** |
||
| 413 | * Checks the cart to see if a course is in the cart. |
||
| 414 | * |
||
| 415 | * @param $course_id |
||
| 416 | * @return bool |
||
| 417 | */ |
||
| 418 | public static function is_course_in_cart( $course_id ){ |
||
| 436 | |||
| 437 | /** |
||
| 438 | * Check the cart to see if the product is in the cart |
||
| 439 | * |
||
| 440 | * @param $product_id |
||
| 441 | * @return bool |
||
| 442 | */ |
||
| 443 | public static function is_product_in_cart( $product_id ){ |
||
| 444 | |||
| 445 | if ( 0 < $product_id ) { |
||
| 446 | |||
| 468 | |||
| 469 | /** |
||
| 470 | * Get all free WooCommerce products |
||
| 471 | * |
||
| 472 | * @since 1.9.0 |
||
| 473 | * |
||
| 474 | * @return array $free_products{ |
||
| 475 | * @type int $wp_post_id |
||
| 476 | * } |
||
| 477 | */ |
||
| 478 | public static function get_free_product_ids(){ |
||
| 498 | |||
| 499 | /** |
||
| 500 | * The metat query for courses that are free |
||
| 501 | * |
||
| 502 | * @since 1.9.0 |
||
| 503 | * @return array $wp_meta_query_param |
||
| 504 | */ |
||
| 505 | public static function get_free_courses_meta_query_args(){ |
||
| 522 | |||
| 523 | /** |
||
| 524 | * The metat query for courses that are free |
||
| 525 | * |
||
| 526 | * @since 1.9.0 |
||
| 527 | * @return array $wp_query_meta_query_args_param |
||
| 528 | */ |
||
| 529 | public static function get_paid_courses_meta_query_args(){ |
||
| 544 | |||
| 545 | /** |
||
| 546 | * The WordPress Query args |
||
| 547 | * for paid products on sale |
||
| 548 | * |
||
| 549 | * @since 1.9.0 |
||
| 550 | * @return array $product_query_args |
||
| 551 | */ |
||
| 552 | View Code Duplication | public static function get_paid_products_on_sale_query_args(){ |
|
| 581 | |||
| 582 | |||
| 583 | /** |
||
| 584 | * Return the WordPress query args for |
||
| 585 | * products not on sale but that is not a free |
||
| 586 | * |
||
| 587 | * @since 1.9.0 |
||
| 588 | * |
||
| 589 | * @return array |
||
| 590 | */ |
||
| 591 | View Code Duplication | public static function get_paid_products_not_on_sale_query_args(){ |
|
| 620 | |||
| 621 | /** |
||
| 622 | * Get all WooCommerce non-free product id's |
||
| 623 | * |
||
| 624 | * @since 1.9.0 |
||
| 625 | * |
||
| 626 | * @return array $woocommerce_paid_product_ids |
||
| 627 | */ |
||
| 628 | public static function get_paid_product_ids(){ |
||
| 651 | |||
| 652 | /** |
||
| 653 | * Get all free courses. |
||
| 654 | * |
||
| 655 | * This course that have a WC product attached |
||
| 656 | * that has a price or sale price of zero and |
||
| 657 | * other courses with no WooCommerce products |
||
| 658 | * attached. |
||
| 659 | * |
||
| 660 | * @since 1.9.0 |
||
| 661 | * |
||
| 662 | * @return array |
||
| 663 | */ |
||
| 664 | public static function get_free_courses(){ |
||
| 680 | |||
| 681 | /** |
||
| 682 | * Return all products that are not free |
||
| 683 | * |
||
| 684 | * @since 1.9.0 |
||
| 685 | * @return array |
||
| 686 | */ |
||
| 687 | public static function get_paid_courses(){ |
||
| 695 | |||
| 696 | /** |
||
| 697 | * Show the WooCommerce add to cart button for the current course |
||
| 698 | * |
||
| 699 | * The function will only show the button if |
||
| 700 | * 1- the user can buy the course |
||
| 701 | * 2- if they have completed their pre-requisite |
||
| 702 | * 3- if the course has a valid product attached |
||
| 703 | * |
||
| 704 | * @since 1.9.0 |
||
| 705 | * @param int $course_id |
||
| 706 | * @return string $html markup for the button or nothing if user not allowed to buy |
||
| 707 | */ |
||
| 708 | public static function the_add_to_cart_button_html( $course_id ){ |
||
| 777 | |||
| 778 | /** |
||
| 779 | * Alter the no permissions message on the single course page |
||
| 780 | * Changes the message to a WooCommerce specific message. |
||
| 781 | * |
||
| 782 | * @since 1.9.0 |
||
| 783 | * |
||
| 784 | * @param $message |
||
| 785 | * @param $post_id |
||
| 786 | * |
||
| 787 | * @return string $message |
||
| 788 | */ |
||
| 789 | public static function alter_no_permissions_message( $message, $post_id ){ |
||
| 811 | /** |
||
| 812 | * Show the no permissions message when a user is logged in |
||
| 813 | * and have not yet purchased the current course |
||
| 814 | * |
||
| 815 | * @since 1.9.0 |
||
| 816 | */ |
||
| 817 | public static function the_course_no_permissions_message( $course_id ){ |
||
| 830 | |||
| 831 | /** |
||
| 832 | * Checks if a user has bought a product item. |
||
| 833 | * |
||
| 834 | * @since 1.9.0 |
||
| 835 | * |
||
| 836 | * @param int $user_id |
||
| 837 | * @param int $product_id |
||
| 838 | * |
||
| 839 | * @return bool |
||
| 840 | */ |
||
| 841 | public static function has_customer_bought_product ( $user_id, $product_id ){ |
||
| 897 | |||
| 898 | /** |
||
| 899 | * Return the product id for the given course |
||
| 900 | * |
||
| 901 | * @since 1.9.0 |
||
| 902 | * |
||
| 903 | * @param int $course_id |
||
| 904 | * |
||
| 905 | * @return string $woocommerce_product_id or false if none exist |
||
| 906 | * |
||
| 907 | */ |
||
| 908 | public static function get_course_product_id( $course_id ){ |
||
| 919 | |||
| 920 | /** |
||
| 921 | * Alter the body classes adding WooCommerce to the body |
||
| 922 | * |
||
| 923 | * @param array $classes |
||
| 924 | * @return array |
||
| 925 | */ |
||
| 926 | public static function add_woocommerce_body_class( $classes ){ |
||
| 937 | |||
| 938 | /** |
||
| 939 | * Responds to when a subscription product is purchased |
||
| 940 | * |
||
| 941 | * @since 1.2.0 |
||
| 942 | * @since 1.9.0 move to class Sensei_WC |
||
| 943 | * |
||
| 944 | * @param WC_Order $order |
||
| 945 | * |
||
| 946 | * @return void |
||
| 947 | */ |
||
| 948 | public static function activate_subscription( $order ) { |
||
| 999 | |||
| 1000 | /** |
||
| 1001 | * Adds detail to to the WooCommerce order |
||
| 1002 | * |
||
| 1003 | * @since 1.4.5 |
||
| 1004 | * @since 1.9.0 function moved to class Sensei_WC and renamed from sensei_woocommerce_email_course_details to email_course_details |
||
| 1005 | * |
||
| 1006 | * @param WC_Order $order |
||
| 1007 | * |
||
| 1008 | * @return void |
||
| 1009 | */ |
||
| 1010 | public static function email_course_details( $order ){ |
||
| 1089 | |||
| 1090 | /** |
||
| 1091 | * sensei_woocommerce_complete_order description |
||
| 1092 | * @since 1.0.3 |
||
| 1093 | * @access public |
||
| 1094 | * @param int $order_id WC order ID |
||
| 1095 | * @return void |
||
| 1096 | */ |
||
| 1097 | public static function complete_order ( $order_id = 0 ) { |
||
| 1148 | |||
| 1149 | /** |
||
| 1150 | * Responds to when an order is cancelled. |
||
| 1151 | * |
||
| 1152 | * @since 1.2.0 |
||
| 1153 | * @since 1.9.0 Move function to the Sensei_WC class |
||
| 1154 | * @param integer| WC_Order $order_id order ID |
||
| 1155 | * @return void |
||
| 1156 | */ |
||
| 1157 | public static function cancel_order ( $order_id ) { |
||
| 1208 | |||
| 1209 | /** |
||
| 1210 | * Returns the WooCommerce Product Object |
||
| 1211 | * |
||
| 1212 | * The code caters for pre and post WooCommerce 2.2 installations. |
||
| 1213 | * |
||
| 1214 | * @since 1.1.1 |
||
| 1215 | * @access public |
||
| 1216 | * @param integer $wc_product_id Product ID or Variation ID |
||
| 1217 | * @param string $product_type '' or 'variation' |
||
| 1218 | * @return WC_Product $wc_product_object |
||
| 1219 | */ |
||
| 1220 | public static function get_product_object ( $wc_product_id = 0, $product_type = '' ) { |
||
| 1254 | |||
| 1255 | /** |
||
| 1256 | * If customer has purchased the course, update Sensei to indicate that they are taking the course. |
||
| 1257 | * |
||
| 1258 | * @since 1.0.0 |
||
| 1259 | * @since 1.9.0 move to class Sensei_WC |
||
| 1260 | * |
||
| 1261 | * @param int $course_id (default: 0) |
||
| 1262 | * @param array/Object $order_user (default: array()) Specific user's data. |
||
| 1263 | * |
||
| 1264 | * @return bool|int |
||
| 1265 | */ |
||
| 1266 | public static function course_update ( $course_id = 0, $order_user = array() ) { |
||
| 1328 | |||
| 1329 | /** |
||
| 1330 | * Disable guest checkout if a course product is in the cart |
||
| 1331 | * |
||
| 1332 | * @since 1.1.0 |
||
| 1333 | * @since 1.9.0 move to class Sensei_WC |
||
| 1334 | * |
||
| 1335 | * @param boolean $guest_checkout Current guest checkout setting |
||
| 1336 | * |
||
| 1337 | * @return boolean Modified guest checkout setting |
||
| 1338 | */ |
||
| 1339 | public static function disable_guest_checkout( $guest_checkout ) { |
||
| 1380 | |||
| 1381 | /** |
||
| 1382 | * Change order status with virtual products to completed |
||
| 1383 | * |
||
| 1384 | * @since 1.1.0 |
||
| 1385 | * @since 1.9.0 move to class Sensei_WC |
||
| 1386 | * |
||
| 1387 | * @param string $order_status |
||
| 1388 | * @param int $order_id |
||
| 1389 | * |
||
| 1390 | * @return string |
||
| 1391 | **/ |
||
| 1392 | public static function virtual_order_payment_complete( $order_status, $order_id ) { |
||
| 1433 | |||
| 1434 | |||
| 1435 | /** |
||
| 1436 | * Determine if the user has and active subscription to give them access |
||
| 1437 | * to the requested resource. |
||
| 1438 | * |
||
| 1439 | * @since 1.9.0 |
||
| 1440 | * |
||
| 1441 | * @param boolean$user_access_permission |
||
| 1442 | * @param integer $user_id |
||
| 1443 | * @return boolean $user_access_permission |
||
| 1444 | */ |
||
| 1445 | public static function get_subscription_permission( $user_access_permission, $user_id ){ |
||
| 1503 | |||
| 1504 | /** |
||
| 1505 | * Get all the valid subscription types. |
||
| 1506 | * |
||
| 1507 | * @since 1.9.0 |
||
| 1508 | * @return array |
||
| 1509 | */ |
||
| 1510 | public static function get_subscription_types(){ |
||
| 1515 | |||
| 1516 | }// end Sensei_WC |
||
| 1517 |
If you return a value from a function or method, it should be a sub-type of the type that is given by the parent type f.e. an interface, or abstract method. This is more formally defined by the Lizkov substitution principle, and guarantees that classes that depend on the parent type can use any instance of a child type interchangably. This principle also belongs to the SOLID principles for object oriented design.
Let’s take a look at an example:
Our function
my_functionexpects aPostobject, and outputs the author of the post. The base classPostreturns a simple string and outputting a simple string will work just fine. However, the child classBlogPostwhich is a sub-type ofPostinstead decided to return anobject, and is therefore violating the SOLID principles. If aBlogPostwere passed tomy_function, PHP would not complain, but ultimately fail when executing thestrtouppercall in its body.