PluginProbe ʕ •ᴥ•ʔ
Weight Based Shipping Table Rate for WooCommerce – Flexible Shipping / 6.10.0
Weight Based Shipping Table Rate for WooCommerce – Flexible Shipping v6.10.0
6.10.0 6.9.1 6.9.0 6.8.1 6.8.0 6.7.4 6.7.3 6.7.2 6.7.0 4.21.7 4.22.0 4.22.1 4.23.0 4.23.1 4.23.2 4.23.3 4.24.0 4.24.1 4.24.10 4.24.11 4.24.12 4.24.13 4.24.14 4.24.15 4.24.16 4.24.17 4.24.18 4.24.19 4.24.2 4.24.4 4.24.6 4.24.7 4.24.8 4.24.9 4.25.0 4.25.1 4.25.2 4.25.4 4.25.5 4.25.6 4.25.7 4.25.8 4.3.0 4.3.1 4.4.0 4.4.1 4.5.0 4.5.1 4.6.0 4.6.1 4.7.0 4.7.1 4.7.2 4.8.0 4.8.1 4.8.3 4.8.4 4.8.5 4.9.0 5.0.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.0.9 5.1.0 5.1.1 5.1.2 5.1.3 5.2.0 5.3.0 5.3.1 5.3.3 5.3.4 5.3.5 6.0.0 6.1.0 6.1.1 6.1.2 6.2.0 6.2.1 6.2.2 6.2.3 6.2.4 6.3.0 trunk 6.4.0 1.4 6.4.1 1.4.1 6.4.2 1.5 6.4.3 1.6 6.4.5 1.6.1 6.5.0 1.6.2 6.5.1 1.7 6.5.2 1.8 6.5.3 1.9 6.5.4 1.9.1 6.5.5 1.9.10 6.5.6 1.9.11 6.5.7 1.9.12 6.5.8 1.9.2 6.6.0 1.9.3 6.6.1 1.9.4 6.6.2 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0 2.0.1 2.1 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 3.0.6 3.0.7 3.1 3.1.1 3.1.10 3.1.11 3.1.12 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 3.10.0 3.11.0 3.11.1 3.11.2 3.11.3 3.11.4 3.12.0 3.13.0 3.14.0 3.14.1 3.14.2 3.14.3 3.14.4 3.15.0 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.2.0 3.3.1 3.3.10 3.3.11 3.3.12 3.3.13 3.3.14 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.3.8 3.3.9 3.4.0 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.7.0 3.8.0 3.9.0 3.9.1 3.9.10 3.9.11 3.9.12 3.9.13 3.9.15 3.9.16 3.9.17 3.9.18 3.9.19 3.9.2 3.9.20 3.9.21 3.9.3 3.9.4 3.9.5 3.9.6 3.9.7 3.9.9 4.0.0 4.0.1 4.0.10 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.0.7 4.0.8 4.0.9 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.10.0 4.10.1 4.11.0 4.11.1 4.11.2 4.11.3 4.11.4 4.11.5 4.11.6 4.11.7 4.11.8 4.11.9 4.12.0 4.13.0 4.13.1 4.13.2 4.13.3 4.14.0 4.14.1 4.14.2 4.15.0 4.16.0 4.16.1 4.16.2 4.17.0 4.18.0 4.18.1 4.18.2 4.18.3 4.18.4 4.18.5 4.18.6 4.19.0 4.19.1 4.2.0 4.20.0 4.20.1 4.20.2 4.20.3 4.21.0 4.21.1 4.21.2 4.21.3 4.21.4 4.21.5
flexible-shipping / src / WPDesk / FS / TableRate / ShippingMethodsIntegration / ShippingRate.php
flexible-shipping / src / WPDesk / FS / TableRate / ShippingMethodsIntegration Last commit date
Integration.php 4 days ago OrderMetaData.php 4 days ago SettingsFields.php 4 days ago ShippingRate.php 4 days ago Tracker.php 4 days ago
ShippingRate.php
169 lines
1 <?php
2
3 namespace WPDesk\FS\TableRate\ShippingMethodsIntegration;
4
5 use FSVendor\Psr\Log\LoggerInterface;
6 use FSVendor\Psr\Log\NullLogger;
7 use FSVendor\WPDesk\FS\TableRate\Logger\NoticeLogger;
8 use FSVendor\WPDesk\FS\TableRate\Logger\ShippingMethodLogger;
9 use FSVendor\WPDesk\FS\TableRate\Settings\MethodSettings;
10 use FSVendor\WPDesk\FS\TableRate\Settings\MethodSettingsFactory;
11 use FSVendor\WPDesk\PluginBuilder\Plugin\Hookable;
12 use WPDesk\FS\TableRate\Rule\Condition\ConditionsFactory;
13 use WPDesk\FS\TableRate\Rule\Cost\RuleAdditionalCostFactory;
14 use WPDesk\FS\TableRate\Rule\Cost\RuleCostFieldsFactory;
15 use WPDesk\FS\TableRate\Rule\CostsCalculator;
16 use WPDesk\FS\TableRate\Rule\ShippingContents\DestinationAddressFactory;
17 use WPDesk\FS\TableRate\Rule\ShippingContents\ShippingContentsImplementation;
18 use WPDesk\FS\TableRate\Rule\SpecialAction\SpecialActionFactory;
19
20 /**
21 * Class ShippingRate
22 */
23 class ShippingRate implements Hookable {
24
25 const FS_CANCEL = 'fs_cancel';
26
27 /**
28 * Logger provided by Flexible Shipping plugin.
29 *
30 * @var LoggerInterface
31 */
32 protected static $fs_logger;
33
34 private array $package;
35
36 /**
37 * Set logger. This logger is set by Flexible Shipping plugin.
38 *
39 * @param LoggerInterface $fs_logger .
40 */
41 public static function set_fs_logger( LoggerInterface $fs_logger ) {
42 static::$fs_logger = $fs_logger;
43 }
44
45 public function hooks() {
46 add_filter( 'woocommerce_shipping_method_add_rate_args', [ $this, 'add_table_rate_shipping_rate' ], 10, 3 );
47 add_action( 'woocommerce_before_get_rates_for_package', [ $this, 'save_package' ], 10 );
48 add_filter( 'woocommerce_package_rates', [ $this, 'remove_canceled_rates' ] );
49 }
50
51 /**
52 * @param array $rates
53 *
54 * @return array
55 */
56 public function remove_canceled_rates( $rates ) {
57 if ( ! is_array( $rates ) ) {
58
59 return $rates;
60 }
61 $meta_key = self::FS_CANCEL;
62 return array_filter(
63 $rates,
64 function ( $rate ) use ( $meta_key ) {
65 if ( ! is_object( $rate ) || ! method_exists( $rate, 'get_meta_data' ) ) {
66
67 return true;
68 }
69
70 return ! ( $rate->get_meta_data()[ $meta_key ] ?? false );
71 }
72 );
73 }
74
75 /**
76 * @param array $package
77 */
78 public function save_package( $package ): void {
79 $this->package = $package;
80 }
81
82 /**
83 * @param array $args
84 * @param \WC_Shipping_Method $shipping_method
85 *
86 * @return array
87 */
88 public function add_table_rate_shipping_rate( $args, $shipping_method ) {
89 if ( ! isset( $this->package ) ) {
90 return $args;
91 }
92 if ( ! is_array( $args ) || $shipping_method->get_option( SettingsFields::FS_CALCULATION_ENABLED, 'no' ) === 'no' ) {
93 return $args;
94 }
95 $base_shipping_cost = is_array( $args['cost'] ) ? array_sum( $args['cost'] ) : (float) $args['cost'];
96 $cost_calculator = $this->prepare_cost_calculator( $shipping_method, $this->package );
97 $cost_calculator->process_rules( $base_shipping_cost );
98 $additional_cost = $cost_calculator->get_calculated_cost() - $base_shipping_cost;
99 if ( ! is_array( $args['meta_data'] ) ) {
100 $args['meta_data'] = [];
101 }
102 if ( $cost_calculator->is_cancel() ) {
103 $args['meta_data'][ self::FS_CANCEL ] = true;
104 } else {
105 if ( ! is_array( $args['cost'] ) ) {
106 $args['cost'] = [ $args['cost'] ];
107 }
108 $args['meta_data'][ OrderMetaData::META_KEY ] = OrderMetaData::prepare_meta_value(
109 $base_shipping_cost,
110 $additional_cost
111 );
112 $args['cost'][] = $additional_cost;
113 }
114
115 return $args;
116 }
117
118 private function prepare_cost_calculator( $shipping_method, $package ): CostsCalculator {
119 $available_conditions = ( new ConditionsFactory() )->get_conditions();
120 $cost_fields = ( new RuleCostFieldsFactory() )->get_fields();
121 $available_additional_costs = ( new RuleAdditionalCostFactory() )->get_additional_costs();
122 $available_special_actions = ( new SpecialActionFactory() )->get_special_actions();
123 $shop_currency = get_option( 'woocommerce_currency' );
124 $rules = $shipping_method->get_option( SettingsFields::SETTING_METHOD_RULES, '[]' );
125 $method_settings = MethodSettingsFactory::create_from_array( [ 'method_rules' => json_decode( $rules, true ) ] );
126 $shipping_contents = new ShippingContentsImplementation(
127 $package['contents'],
128 WC()->cart->display_prices_including_tax(),
129 wc_get_price_decimals(),
130 DestinationAddressFactory::create_from_package_destination( $package['destination'] ?? [] ),
131 get_woocommerce_currency()
132 );
133
134 return new CostsCalculator(
135 $method_settings,
136 $shipping_contents,
137 $available_conditions,
138 $cost_fields,
139 $available_additional_costs,
140 $available_special_actions,
141 wc_get_price_decimals(),
142 $shop_currency,
143 $this->prepare_shipping_method_calculation_logger( $method_settings, $shipping_method->instance_id )
144 );
145 }
146
147 private function prepare_shipping_method_calculation_logger( MethodSettings $shipping_method_settings, int $instance_id ): ShippingMethodLogger {
148 $method_debug_mode = $shipping_method_settings->get_debug_mode();
149 $shipping_method_title = $shipping_method_settings->get_title();
150 $shipping_method_url = admin_url(
151 'admin.php?page=wc-settings&tab=shipping&instance_id=' . sanitize_key( $instance_id ) . '&action=edit&method_id=' . sanitize_key( $shipping_method_settings->get_id() )
152 );
153 if ( null !== static::$fs_logger ) {
154 $fs_logger = static::$fs_logger;
155 } else {
156 $fs_logger = new NullLogger();
157 }
158
159 return new ShippingMethodLogger(
160 $fs_logger,
161 new NoticeLogger(
162 $shipping_method_title,
163 $shipping_method_url,
164 'yes' === $method_debug_mode && current_user_can( 'manage_woocommerce' )
165 )
166 );
167 }
168 }
169