PluginProbe
MakeCommerce for WooCommerce / 3.5.4
MakeCommerce for WooCommerce v3.5.4
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.5.4, at shipping/method/shippingclasses.php

138 lines 4.0 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 if ( !is_numeric( $rate['cost'] ) ) {
78 $rate['cost'] = intval( $rate['cost'] );
79 }
80
81 if ( !is_numeric( $highest_class_cost ) ) {
82 $highest_class_cost = intval( $highest_class_cost );
83 }
84
85 $rate['cost'] += $highest_class_cost;
86 }
87
88 return $rate;
89 }
90
91 /**
92 * Finds and returns a shipping classes
93 *
94 * @since 3.0.6
95 */
96 public function find_shipping_classes( $package ) {
97
98 $found_shipping_classes = array();
99
100 foreach ( $package['contents'] as $item_id => $values ) {
101 if ( $values['data']->needs_shipping() ) {
102 $found_class = $values['data']->get_shipping_class();
103
104 if ( ! isset( $found_shipping_classes[ $found_class ] ) ) {
105 $found_shipping_classes[ $found_class ] = array();
106 }
107
108 $found_shipping_classes[ $found_class ][ $item_id ] = $values;
109 }
110 }
111
112 return $found_shipping_classes;
113 }
114
115 /**
116 * Formats and returns sum
117 *
118 * @since 3.0.6
119 */
120 protected function evaluate_cost( $sum ) {
121
122 $locale = localeconv();
123 $decimals = array( wc_get_price_decimal_separator(), $locale['decimal_point'], $locale['mon_decimal_point'] );
124
125 // Remove whitespace from string.
126 $sum = preg_replace( '/\s+/', '', $sum );
127
128 // Remove locale from string.
129 $sum = str_replace( $decimals, '.', $sum );
130
131 // Trim invalid start/end characters.
132 $sum = rtrim( ltrim( $sum, "\t\n\r\0\x0B+*/" ), "\t\n\r\0\x0B+-*/" );
133
134 // Do the math.
135 return $sum ? $sum : 0;
136 }
137 }
138