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 / RulesSettingsField.php
flexible-shipping / src / WPDesk / FS / TableRate Last commit date
AI 3 days ago Beacon 3 days ago ContextualInfo 3 days ago Debug 3 days ago Exception 3 days ago FreeShipping 3 days ago ImporterExporter 3 days ago Order 3 days ago Rates 3 days ago Rule 3 days ago ShippingMethod 3 days ago ShippingMethodsIntegration 3 days ago Tax 3 days ago views 3 days ago Beacon.php 3 days ago DefaultRulesSettings.php 3 days ago MultiCurrency.php 3 days ago RulesSettingsField.php 3 days ago RulesTableSettings.php 3 days ago ShippingMethodSingle.php 3 days ago UserFeedback.php 3 days ago
RulesSettingsField.php
323 lines
1 <?php
2 /**
3 * @package WPDesk\FS\TableRate
4 */
5
6 namespace WPDesk\FS\TableRate;
7
8 use WPDesk\FS\TableRate\Rule\Condition\ConditionsFactory;
9 use WPDesk\FS\TableRate\Rule\Cost\RuleAdditionalCostFieldsFactory;
10 use WPDesk\FS\TableRate\Rule\Cost\RuleAdditionalCostFactory;
11 use WPDesk\FS\TableRate\Rule\Cost\RuleCostFieldsFactory;
12 use WPDesk\FS\TableRate\Rule\PreconfiguredScenarios\PreconfiguredScenariosFactory;
13 use WPDesk\FS\TableRate\Rule\SpecialAction\SpecialActionFieldsFactory;
14 use WPDesk\FS\TableRate\Rule\SpecialAction\SpecialActionFactory;
15 use WPDesk\FS\ProFeatures;
16 use WPDesk\FS\TableRate\Rule\PreconfiguredScenarios;
17
18 /**
19 * Class RulesSettings
20 */
21 class RulesSettingsField {
22
23 const FIELD_TYPE = 'shipping_rules';
24
25 private const AI_PURCHASE_URL = 'https://octol.io/flexibleshipping-ai';
26 private const AI_PURCHASE_URL_PL = 'https://octol.io/flexibleshipping-ai-pl';
27
28 /**
29 * @var string
30 */
31 protected static $assets_url;
32
33 /**
34 * @var string
35 */
36 private $settings_field_id;
37
38 /**
39 * @var string
40 */
41 private $settings_field_name;
42
43 /**
44 * @var string
45 */
46 private $settings_field_title;
47
48 /**
49 * @var array
50 */
51 private $settings;
52
53 /**
54 * @var array
55 */
56 private $value;
57
58 /**
59 * @var array
60 */
61 private $shipping_method_settings;
62
63 /**
64 * RulesSettings constructor.
65 *
66 * @param string $settings_field_id .
67 * @param string $settings_field_name .
68 * @param string $settings_field_title .
69 * @param array $settings .
70 * @param array $value .
71 * @param array $shipping_method_settings .
72 */
73 public function __construct( $settings_field_id, $settings_field_name, $settings_field_title, $settings, $value = null, $shipping_method_settings = [] ) {
74 $this->settings_field_id = $settings_field_id;
75 $this->settings_field_name = $settings_field_name;
76 $this->settings_field_title = $settings_field_title;
77 $this->settings = $settings;
78 $this->value = $value;
79 $this->shipping_method_settings = $shipping_method_settings;
80 }
81
82 /**
83 * @param string $assets_url .
84 */
85 public static function set_assets_url( $assets_url ) {
86 self::$assets_url = $assets_url;
87 }
88
89 /**
90 * Render settings.
91 *
92 * @return string
93 */
94 public function render() {
95 ob_start();
96 $settings_field_id = $this->settings_field_id;
97 $settings_field_name = $this->settings_field_name;
98 $settings_field_title = $this->settings_field_title;
99 $available_conditions = $this->get_available_conditions();
100 $rules_settings = $this->get_normalized_settings( $available_conditions );
101 $available_conditions = array_values( $available_conditions );
102 $translations = $this->get_translations();
103 $pro_features_data = $this->get_pro_features_data();
104 $table_settings = $this->get_table_settings();
105
106 $cost_settings_fields = $this->get_available_cost_settings();
107 $additional_cost_fields = $this->get_additional_cost_fields();
108 $special_action_fields = $this->get_special_actions_fields();
109 $preconfigured_scenarios = $this->get_preconfigured_scenarios();
110
111 $shop_settings = $this->get_shop_settings();
112
113 $is_pro_activated = defined( 'FLEXIBLE_SHIPPING_PRO_VERSION' );
114
115 $rules_table_settings = [
116 'rules_settings' => $rules_settings,
117 'table_settings' => $table_settings,
118 'translations' => $translations,
119 'available_conditions' => $available_conditions,
120 'cost_settings_fields' => $cost_settings_fields,
121 'special_action_fields' => $special_action_fields,
122 'additional_cost_fields' => $additional_cost_fields,
123 'preconfigured_scenarios' => $preconfigured_scenarios,
124 'is_pro_activated' => $is_pro_activated,
125 'pro_features_data' => $pro_features_data,
126 'paste_available' => true,
127 'ai_button_available' => false,
128 'ai_button_url' => 'https://octol.io/fs-rules-table-ai',
129 'ai_local_button_available' => true,
130 'ai_local_message_title' => __( 'Let AI build your rules table', 'flexible-shipping' ),
131 'ai_local_message' => $this->get_ai_local_message(),
132 'ai_local_message_action' => __( 'Get Flexible Shipping PRO →', 'flexible-shipping' ),
133 'ai_local_message_action_url' => $this->get_ai_purchase_url(),
134 'shop_settings' => $shop_settings,
135 ];
136
137 $rules_table_settings = $this->filter_rules_table_settings( $rules_table_settings );
138
139 include __DIR__ . '/views/shipping-method-settings-rules.php';
140
141 return ob_get_clean();
142 }
143
144 /**
145 * Filters rules table settings.
146 *
147 * @param array $rules_table_settings Rules table settings.
148 *
149 * @return array
150 */
151 protected function filter_rules_table_settings( array $rules_table_settings ): array {
152 // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
153 return apply_filters( 'flexible-shipping/rules-table/settings', $rules_table_settings, $this->shipping_method_settings );
154 }
155
156 private function get_ai_local_message(): string {
157 $message = sprintf(
158 // Translators: 1: opening content tag, 2: closing content tag, 3: opening line break and strong tags, 4: closing strong tag, 5: opening list tag, 6: closing list tag, 7: opening list item tag, 8: closing list item tag, 9: opening strong tag, 10: closing strong tag.
159 __(
160 '%1$sThe AI Shipping Assistant is included with an active Flexible Shipping PRO subscription. Describe your shipping scenario in plain language, and it generates a ready-to-use rules table for you.
161 %3$sWith an active subscription, you get:%4$s
162 %5$s
163 %7$s%9$sShipping configuration%10$s in under 60 seconds thanks to AI%8$s
164 %7$s%9$sAutomatic plugin updates%10$s for as long as your subscription is active%8$s
165 %7$s%9$sHuman 1-on-1 support%10$s, whenever you need it%8$s
166 %6$s
167 %2$s',
168 'flexible-shipping'
169 ),
170 '<span class="fspro-ai-subscription-content">',
171 '</span>',
172 '<br><br><strong>',
173 '</strong>',
174 '<ul class="fspro-ai-subscription-benefits">',
175 '</ul>',
176 '<li>',
177 '</li>',
178 '<strong>',
179 '</strong>'
180 );
181
182 return $message . sprintf(
183 '<span class="fspro-ai-subscription-footer"><button type="button" class="fspro-ai-maybe-later">%1$s</button><small>%2$s</small></span>',
184 esc_html__( 'Maybe later', 'flexible-shipping' ),
185 esc_html__( '30-day money-back guarantee · Cancel anytime', 'flexible-shipping' )
186 );
187 }
188
189 private function get_ai_purchase_url(): string {
190 return get_user_locale() === 'pl_PL' ? self::AI_PURCHASE_URL_PL : self::AI_PURCHASE_URL;
191 }
192
193 private function get_shop_settings() {
194 return [
195 'currency' => get_woocommerce_currency(),
196 'currency_symbol' => get_woocommerce_currency_symbol(),
197 'locale' => get_user_locale(),
198 'weight_unit' => get_option( 'woocommerce_weight_unit' ),
199 'dimension_unit' => get_option( 'woocommerce_dimension_unit' ),
200 'price_num_decimals' => wc_get_price_decimals(),
201 ];
202 }
203
204 /**
205 * @return array
206 */
207 private function get_pro_features_data(): array {
208 return [
209 'ajax_url' => admin_url( 'admin-ajax.php' ),
210 'ajax_action' => ProFeatures\Tracker\AjaxTracker::AJAX_ACTION,
211 'ajax_nonce' => wp_create_nonce( ProFeatures\Tracker\AjaxTracker::AJAX_ACTION ),
212 'fs_pro_link' => 'pl_PL' === get_user_locale()
213 ? 'https://octol.io/fs-pro-features-pl'
214 : 'https://octol.io/fs-pro-features',
215 ];
216 }
217
218 /**
219 * @return array
220 */
221 private function get_translations() {
222 return [
223 'assets_url' => self::$assets_url,
224 'ajax_url_scenarios_tracking' => admin_url( 'admin-ajax.php?action=' . PreconfiguredScenarios\Tracker\AjaxTracker::AJAX_ACTION ),
225 'scenarios_tracking_nonce' => wp_create_nonce( PreconfiguredScenarios\Tracker\AjaxTracker::AJAX_ACTION ),
226 'scenarios_docs_link' =>
227 'pl_PL' === get_locale()
228 ? 'https://octol.io/fs-scenarios-pl'
229 : 'https://octol.io/fs-scenarios',
230 ];
231 }
232
233 /**
234 * @return array
235 */
236 private function get_available_cost_settings() {
237 $rule_costs_fields_factory = new RuleCostFieldsFactory();
238
239 return $rule_costs_fields_factory->get_normalized_cost_fields();
240 }
241
242 /**
243 * @return array
244 */
245 private function get_additional_cost_fields() {
246 $rule_additional_costs_fields_factory = new RuleAdditionalCostFieldsFactory( ( new RuleAdditionalCostFactory() )->get_additional_costs() );
247
248 return $rule_additional_costs_fields_factory->get_normalized_cost_fields();
249 }
250
251 /**
252 * @return array
253 */
254 private function get_special_actions_fields() {
255 $special_actions_fields_factory = new SpecialActionFieldsFactory( ( new SpecialActionFactory() )->get_special_actions() );
256
257 return $special_actions_fields_factory->get_normalized_cost_fields();
258 }
259
260 /**
261 * @retrun array
262 */
263 private function get_preconfigured_scenarios() {
264 return ( new PreconfiguredScenariosFactory() )->get_scenarios();
265 }
266
267 /**
268 * @return array
269 */
270 private function get_table_settings() {
271 return ( new RulesTableSettings() )->get_table_settings();
272 }
273
274 /**
275 * @return Rule\Condition\Condition[]
276 */
277 private function get_available_conditions() {
278 return ( new ConditionsFactory() )->get_conditions();
279 }
280
281 /**
282 * @param Rule\Condition\Condition[] $available_conditions .
283 *
284 * @return array
285 */
286 private function get_normalized_settings( $available_conditions ) {
287 $rules_settings = RulesSettingsFactory::create_from_array( $this->get_field_value() );
288
289 return $this->process_select_options_for_conditions( $rules_settings->get_normalized_settings(), $available_conditions );
290 }
291
292 /**
293 * @return array
294 */
295 private function get_field_value(): array {
296 $value = ! isset( $this->value ) ? ( $this->settings['default'] ?? [] ) : $this->value;
297 if ( ! is_array( $value ) ) {
298 $value = [];
299 }
300 return $value;
301 }
302
303 /**
304 * @param array $settings .
305 * @param Rule\Condition\Condition[] $available_conditions .
306 *
307 * @return array
308 */
309 private function process_select_options_for_conditions( array $settings, $available_conditions ) {
310 foreach ( $settings as $rule_key => $rule ) {
311 $conditions = isset( $rule['conditions'] ) && is_array( $rule['conditions'] ) ? $rule['conditions'] : [];
312 foreach ( $conditions as $condition_key => $condition ) {
313 if ( isset( $available_conditions[ $condition['condition_id'] ] ) ) {
314 $settings[ $rule_key ]['conditions'][ $condition_key ] = $available_conditions[ $condition['condition_id'] ]->prepare_settings( $condition );
315 }
316 }
317 $settings[ $rule_key ]['conditions'] = array_values( $settings[ $rule_key ]['conditions'] );
318 }
319
320 return $settings;
321 }
322 }
323