Whether to return all fields or only the ones that are still registered. Default false. * * @return array An array of fields. */ public function get_all_fields_from_customer( $customer, $all = false ) { $customer_id = $customer->get_id(); $meta_data = array( 'billing' => array(), 'shipping' => array(), 'additional' => array(), ); if ( ! $customer_id ) { if ( isset( wc()->session ) ) { $meta_data['billing'] = wc()->session->get( self::BILLING_FIELDS_KEY, array() ); $meta_data['shipping'] = wc()->session->get( self::SHIPPING_FIELDS_KEY, array() ); $meta_data['additional'] = wc()->session->get( self::ADDITIONAL_FIELDS_KEY, array() ); } } else { $meta_data['billing'] = get_user_meta( $customer_id, self::BILLING_FIELDS_KEY, true ); $meta_data['shipping'] = get_user_meta( $customer_id, self::SHIPPING_FIELDS_KEY, true ); $meta_data['additional'] = get_user_meta( $customer_id, self::ADDITIONAL_FIELDS_KEY, true ); } return $this->format_meta_data( $meta_data, $all ); } /** * Returns an array of all fields values for a given order. * * @param \WC_Order $order The order to get the fields for. * @param bool $all Whether to return all fields or only the ones that are still registered. Default false. * * @return array An array of fields. */ public function get_all_fields_from_order( $order, $all = false ) { $meta_data = array( 'billing' => array(), 'shipping' => array(), 'additional' => array(), ); if ( $order instanceof \WC_Order ) { $meta_data['billing'] = $order->get_meta( self::BILLING_FIELDS_KEY, true ); $meta_data['shipping'] = $order->get_meta( self::SHIPPING_FIELDS_KEY, true ); $meta_data['additional'] = $order->get_meta( self::ADDITIONAL_FIELDS_KEY, true ); } return $this->format_meta_data( $meta_data, $all ); } /** * Returns an array of all fields values for a given meta object. It would add the billing or shipping prefix to the keys. * * @param array $meta The meta data to format. * @param bool $all Whether to return all fields or only the ones that are still registered. Default false. * * @return array An array of fields. */ private function format_meta_data( $meta, $all = false ) { $billing_fields = $meta['billing'] ?? array(); $shipping_fields = $meta['shipping'] ?? array(); $additional_fields = $meta['additional'] ?? array(); $fields = array(); if ( is_array( $billing_fields ) ) { foreach ( $billing_fields as $key => $value ) { if ( ! $all && ! $this->is_field( $key ) ) { continue; } $fields[ '/billing/' . $key ] = $value; } } if ( is_array( $shipping_fields ) ) { foreach ( $shipping_fields as $key => $value ) { if ( ! $all && ! $this->is_field( $key ) ) { continue; } $fields[ '/shipping/' . $key ] = $value; } } if ( is_array( $additional_fields ) ) { foreach ( $additional_fields as $key => $value ) { if ( ! $all && ! $this->is_field( $key ) ) { continue; } $fields[ $key ] = $value; } } return $fields; } /** * From a set of fields, returns only the ones that should be saved to the customer. * For now, this only supports fields in address location. * * @param array $fields The fields to filter. * * @return array The filtered fields. */ public function filter_fields_for_customer( $fields ) { $customer_fields_keys = $this->get_address_fields_keys(); return array_filter( $fields, function( $key ) use ( $customer_fields_keys ) { return in_array( $key, $customer_fields_keys, true ); }, ARRAY_FILTER_USE_KEY ); } }