PluginProbe
MakeCommerce for WooCommerce / 3.0.12
MakeCommerce for WooCommerce v3.0.12
4.1.0 4.0.8 trunk 1.0 1.0.1 1.0.2 1.0.3 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 2.0.0 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.2.0 2.2.1 2.2.2 All 96 releases
makecommerce / shipping / method / shippingclasses.php

shippingclasses.php in MakeCommerce for WooCommerce 3.0.12, at shipping/method/shippingclasses.php

130 lines 3.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace MakeCommerce\Shipping\Method;
4
5 /**
6 * Adds shipping classes functionality to shipping methods
7 *
8 * @since 3.0.6
9 */
10
11 trait ShippingClasses {
12
13 /**
14 * Add shipping class specific form fields to admin
15 *
16 * @since 3.0.6
17 */
18 public function add_form_fields( $instance_form_fields ) {
19
20 $shipping_classes = WC()->shipping()->get_shipping_classes();
21
22 if ( ! empty( $shipping_classes ) ) {
23
24 $instance_form_fields['class_costs'] = array(
25 'title' => __( 'Shipping class costs (optional)', 'wc_makecommerce_domain' ),
26 'description' => __( 'Shipping class cost is added to the shipping price. If multiple are found, the one with highest cost is added.', 'wc_makecommerce_domain' ),
27 'type' => 'title',
28 'default' => '',
29 );
30
31 foreach ( $shipping_classes as $shipping_class ) {
32
33 if ( ! isset( $shipping_class->term_id ) ) {
34 continue;
35 }
36
37 $instance_form_fields[ 'class_cost_' . $shipping_class->term_id ] = array(
38 'title' => esc_html( $shipping_class->name ),
39 'type' => 'text',
40 'default' => '',
41 'desc_tip' => true,
42 );
43 }
44 }
45
46 return $instance_form_fields;
47 }
48
49 /**
50 * Calculates shipping price using shipping class costs
51 *
52 * @since 3.0.6
53 */
54 public function calculate_shipping_class_price( $rate, $package ) {
55
56 $shipping_classes = WC()->shipping()->get_shipping_classes();
57
58 if ( !empty( $shipping_classes ) ) {
59 $found_shipping_classes = $this->find_shipping_classes( $package );
60 $highest_class_cost = 0;
61
62 foreach ( $found_shipping_classes as $shipping_class => $products ) {
63 $shipping_class_term = get_term_by( 'slug', $shipping_class, 'product_shipping_class' );
64 $class_cost_string = $shipping_class_term && $shipping_class_term->term_id ? $this->get_option( 'class_cost_' . $shipping_class_term->term_id, $this->get_option( 'class_cost_' . $shipping_class, '' ) ) : 0;
65
66 if ( '' === $class_cost_string ) {
67 continue;
68 }
69
70 $class_cost = $this->evaluate_cost( $class_cost_string );
71
72 if ( $class_cost > $highest_class_cost ) {
73 $highest_class_cost = $class_cost;
74 }
75 }
76
77 $rate['cost'] += $highest_class_cost;
78 }
79
80 return $rate;
81 }
82
83 /**
84 * Finds and returns a shipping classes
85 *
86 * @since 3.0.6
87 */
88 public function find_shipping_classes( $package ) {
89
90 $found_shipping_classes = array();
91
92 foreach ( $package['contents'] as $item_id => $values ) {
93 if ( $values['data']->needs_shipping() ) {
94 $found_class = $values['data']->get_shipping_class();
95
96 if ( ! isset( $found_shipping_classes[ $found_class ] ) ) {
97 $found_shipping_classes[ $found_class ] = array();
98 }
99
100 $found_shipping_classes[ $found_class ][ $item_id ] = $values;
101 }
102 }
103
104 return $found_shipping_classes;
105 }
106
107 /**
108 * Formats and returns sum
109 *
110 * @since 3.0.6
111 */
112 protected function evaluate_cost( $sum ) {
113
114 $locale = localeconv();
115 $decimals = array( wc_get_price_decimal_separator(), $locale['decimal_point'], $locale['mon_decimal_point'] );
116
117 // Remove whitespace from string.
118 $sum = preg_replace( '/\s+/', '', $sum );
119
120 // Remove locale from string.
121 $sum = str_replace( $decimals, '.', $sum );
122
123 // Trim invalid start/end characters.
124 $sum = rtrim( ltrim( $sum, "\t\n\r\0\x0B+*/" ), "\t\n\r\0\x0B+-*/" );
125
126 // Do the math.
127 return $sum ? $sum : 0;
128 }
129 }
130