<?php /** * Class TrackerData * * @package WPDesk\FS\TableRate\Rule */ namespace WPDesk\FS\TableRate\Rule; use FSVendor\WPDesk\PluginBuilder\Plugin\Hookable; /** * Can append rule data to tracker data. */ class TrackerData implements Hookable { const FIELD_OPERATOR = 'operator'; const FIELD_OPERATOR_COUNT = 'operator_count'; const FIELD_CONDITION_OPERATOR_COUNT = 'condition_operator_count'; /** * Hooks. */ public function hooks() { add_filter( 'flexible-shipping/tracker/method-rule-data', array( $this, 'append_method_rule_data' ), 10, 2 ); } /** * @param array $tracker_data . * @param array $rule_configuration . * * @return array */ public function append_method_rule_data( $tracker_data, $rule_configuration ) { $conditions = isset( $rule_configuration['conditions'] ) ? $rule_configuration['conditions'] : array( array( 'condition_id' => 'none' ) ); $tracker_data = $this->append_conditions_data( $tracker_data, $conditions ); $additional_costs = isset( $rule_configuration['additional_costs'] ) ? $rule_configuration['additional_costs'] : array(); $tracker_data = $this->append_additional_costs_data( $tracker_data, $additional_costs ); $special_action = ! empty( $rule_configuration['special_action'] ) ? $rule_configuration['special_action'] : 'none'; $tracker_data = $this->append_special_action_data( $tracker_data, $special_action ); if ( ! empty( $rule_configuration['cost_per_order'] ) ) { $tracker_data['cost_per_order_count'] ++; } return $tracker_data; } /** * @param array $tracker_data . * @param array $conditions . */ private function append_conditions_data( $tracker_data, $conditions ) { $conditions_count = count( $conditions ); if ( empty( $tracker_data['conditions_per_rule'] ) ) { $tracker_data['conditions_per_rule'] = array(); } if ( empty( $tracker_data['conditions_per_rule'][ $conditions_count ] ) ) { $tracker_data['conditions_per_rule'][ $conditions_count ] = 0; } $tracker_data['conditions_per_rule'][ $conditions_count ]++; foreach ( $conditions as $condition ) { $condition_id = isset( $condition['condition_id'] ) ? $condition['condition_id'] : false; if ( $condition_id ) { if ( empty( $tracker_data['based_on'][ $condition_id ] ) ) { $tracker_data['based_on'][ $condition_id ] = 0; } $tracker_data['based_on'][ $condition_id ] ++; if ( ! empty( $condition['min'] ) ) { $tracker_data['min_count']++; } if ( ! empty( $condition['max'] ) ) { $tracker_data['max_count']++; } if ( ! empty( $condition['shipping_class'] ) ) { $shipping_class = $condition['shipping_class']; if ( ! in_array( $shipping_class, array( 'all', 'any', 'none' ), true ) ) { $shipping_class = 'shipping_class'; } if ( empty( $tracker_data['shipping_class_option'][ $shipping_class ] ) ) { $tracker_data['shipping_class_option'][ $shipping_class ] = 0; } $tracker_data['shipping_class_option'][ $shipping_class ] ++; } $tracker_data = $this->append_operator_data( $condition, $tracker_data, $condition_id ); } } return $tracker_data; } /** * @param array $tracker_data . * @param array $additional_costs . * * @return array */ private function append_additional_costs_data( $tracker_data, $additional_costs ) { $additional_costs_count = count( $additional_costs ); if ( empty( $tracker_data['additional_costs_per_rule'] ) ) { $tracker_data['additional_costs_per_rule'] = array(); } if ( empty( $tracker_data['additional_costs_per_rule'][ $additional_costs_count ] ) ) { $tracker_data['additional_costs_per_rule'][ $additional_costs_count ] = 0; } $tracker_data['additional_costs_per_rule'][ $additional_costs_count ]++; $tracker_data['additional_cost_count'] += $additional_costs_count; if ( ! isset( $tracker_data['additional_costs'] ) ) { $tracker_data['additional_costs'] = array(); } foreach ( wp_list_pluck( $additional_costs, 'based_on' ) as $based_on ) { if ( ! isset( $tracker_data['additional_costs'][ $based_on ] ) ) { $tracker_data['additional_costs'][ $based_on ] = 0; } $tracker_data['additional_costs'][ $based_on ] ++; } return $tracker_data; } /** * @param array $tracker_data . * @param string $special_action . * * @return array */ private function append_special_action_data( $tracker_data, $special_action ) { if ( ! isset( $tracker_data['special_actions'] ) ) { $tracker_data['special_actions'] = array(); } if ( ! isset( $tracker_data['special_actions'][ $special_action ] ) ) { $tracker_data['special_actions'][ $special_action ] = 0; } $tracker_data['special_actions'][ $special_action ]++; if ( in_array( $special_action, array( 'stop', 'cancel' ), true ) ) { $tracker_data[ $special_action . '_count' ]++; } return $tracker_data; } /** * @param array $condition . * @param array $tracker_data . * @param string $condition_id . * * @return array */ private function append_operator_data( $condition, array $tracker_data, $condition_id ) { if ( ! empty( $condition[ self::FIELD_OPERATOR ] ) ) { $operator = $condition[ self::FIELD_OPERATOR ]; if ( ! isset( $tracker_data[ self::FIELD_OPERATOR_COUNT ] ) ) { $tracker_data[ self::FIELD_OPERATOR_COUNT ] = array(); } if ( ! isset( $tracker_data[ self::FIELD_OPERATOR_COUNT ][ $operator ] ) ) { $tracker_data[ self::FIELD_OPERATOR_COUNT ][ $operator ] = 0; } $tracker_data[ self::FIELD_OPERATOR_COUNT ][ $operator ] ++; if ( ! isset( $tracker_data[ self::FIELD_CONDITION_OPERATOR_COUNT ] ) ) { $tracker_data[ self::FIELD_CONDITION_OPERATOR_COUNT ] = array(); } $condition_operator = $condition_id . '-' . $operator; if ( ! isset( $tracker_data[ self::FIELD_CONDITION_OPERATOR_COUNT ][ $condition_operator ] ) ) { $tracker_data[ self::FIELD_CONDITION_OPERATOR_COUNT ][ $condition_operator ] = 0; } $tracker_data[ self::FIELD_CONDITION_OPERATOR_COUNT ][ $condition_operator ] ++; } return $tracker_data; } }