<?php namespace WPDesk\FS\TableRate\ShippingMethodsIntegration; use FSVendor\WPDesk\PluginBuilder\Plugin\Hookable; use WPDesk\FS\TableRate\DefaultRulesSettings; use WPDesk\FS\TableRate\RulesSettingsField; /** * Class SettingsFields */ class SettingsFields implements Hookable { const SETTING_METHOD_RULES = 'fs_method_rules'; const FS_CALCULATION_ENABLED = 'fs_calculation_enabled'; public function hooks() { add_filter( 'woocommerce_generate_' . RulesSettingsField::FIELD_TYPE . '_html', [ $this, 'generate_shipping_rules_html' ], 10, 4 ); add_filter( 'woocommerce_shipping_methods', [ $this, 'add_fields' ], PHP_INT_MAX ); add_filter( 'woocommerce_shipping_method_supports', [ $this, 'remove_modal_settings_from_shipping_methods' ], 10, 3 ); } /** * @param bool $supports * @param string $feature * @param \WC_Shipping_Method $shipping_method * * @return bool */ public function remove_modal_settings_from_shipping_methods( $supports, $feature, $shipping_method ) { if ( in_array( $shipping_method->id ?? '', $this->get_allowed_shipping_methods_instance_settings(), true ) ) { if ( $feature === 'instance-settings-modal' ) { return false; } } return $supports; } /** * @param array $methods * * @return array */ public function add_fields( $methods ) { foreach ( $methods as $shipping_method => $class ) { if ( ! in_array( $shipping_method, $this->get_not_allowed_shipping_methods_instance_settings(), true ) ) { add_filter( 'woocommerce_shipping_instance_form_fields_' . $shipping_method, [ $this, 'add_table_rate_fields' ], PHP_INT_MAX ); } if ( in_array( $shipping_method, $this->get_allowed_shipping_methods_global_settings(), true ) ) { add_filter( 'woocommerce_settings_api_form_fields_' . $shipping_method, [ $this, 'add_table_rate_fields' ], PHP_INT_MAX ); } } return $methods; } private function get_not_allowed_shipping_methods_instance_settings() { return apply_filters( 'flexible-shipping/integration/not-allowed-shipping-methods-instance-settings', [ 'flexible_shipping_single', 'free_shipping', 'box_now_delivery', 'mondialrelay_official_shipping', ] ); } private function get_allowed_shipping_methods_instance_settings() { return apply_filters( 'flexible-shipping/integration/allowed-shipping-methods-instance-settings', [ 'flat_rate', ] ); } private function get_allowed_shipping_methods_global_settings() { return apply_filters( 'flexible-shipping/integration/allowed-shipping-methods-global-settings', [] ); } /** * @param string $field_html * @param string $key * @param array $data * @param \WC_Shipping_Method $shipping_method * * @return string */ public function generate_shipping_rules_html( $field_html, $key, $data, $shipping_method ): string { $title = $data['title']; $field_key = 'woocommerce_' . $shipping_method->id . '_' . self::SETTING_METHOD_RULES; $rules_settings = new RulesSettingsField( $field_key, $field_key, $title, [], json_decode( $shipping_method->get_option( self::SETTING_METHOD_RULES, json_encode( ( new DefaultRulesSettings() )->get_normalized_settings() ) ), true ) ); return $rules_settings->render(); } /** * @param array $fields * * @return array */ public function add_table_rate_fields( $fields ) { if ( ! is_array( $fields ) || empty( $fields ) ) { return $fields; } $fields['fs_method_rules_title'] = [ 'type' => 'title', 'title' => __( 'Additional costs by Flexible Shipping Table Rate', 'flexible-shipping' ), 'default' => '', ]; $fields[ self::FS_CALCULATION_ENABLED ] = [ 'title' => __( 'Additional Costs', 'flexible-shipping' ), 'type' => 'checkbox', 'label' => __( 'Enable Flexible Shipping Rules Table', 'flexible-shipping' ), 'default' => 'no', 'class' => 'fs-costs-calculation-enabled', ]; $fields[ self::SETTING_METHOD_RULES ] = [ 'title' => __( 'Shipping Cost Calculation Rules', 'flexible-shipping' ), 'type' => RulesSettingsField::FIELD_TYPE, 'sanitize_callback' => [ self::class, 'sanitize_shipping_rules' ], 'default' => json_encode( ( new DefaultRulesSettings() )->get_normalized_settings() ), ]; return $fields; } /** * @param array $value * * @return string */ public static function sanitize_shipping_rules( $value ) { return json_encode( $value ); } }