omer Whether to set the field value on the customer or not.
*
* @return void
*/
public function persist_field_for_order( $key, $value, $order, $set_customer = true ) {
$this->set_array_meta( $key, $value, $order );
if ( $set_customer && $order->get_customer_id() ) {
$customer = new WC_Customer( $order->get_customer_id() );
$this->persist_field_for_customer( $key, $value, $customer );
}
}
/**
* Persists a field value for a given customer.
*
* @param string $key The field key.
* @param mixed $value The field value.
* @param WC_Customer $customer The customer to persist the field for.
*
* @return void
*/
public function persist_field_for_customer( $key, $value, $customer ) {
$this->set_array_meta( $key, $value, $customer );
}
/**
* Sets a field value in an array meta, supporting routing things to billing, shipping, or additional fields, based on a prefix for the key.
*
* @param string $key The field key.
* @param mixed $value The field value.
* @param WC_Customer|WC_Order $object The object to set the field value for.
*
* @return void
*/
private function set_array_meta( $key, $value, $object ) {
$meta_key = '';
if ( 0 === strpos( $key, '/billing/' ) ) {
$meta_key = self::BILLING_FIELDS_KEY;
$key = str_replace( '/billing/', '', $key );
} elseif ( 0 === strpos( $key, '/shipping/' ) ) {
$meta_key = self::SHIPPING_FIELDS_KEY;
$key = str_replace( '/shipping/', '', $key );
} else {
$meta_key = self::ADDITIONAL_FIELDS_KEY;
}
$meta_data = $object->get_meta( $meta_key, true );
if ( ! is_array( $meta_data ) ) {
$meta_data = array();
}
$meta_data[ $key ] = $value;
// Replacing all meta using `add_meta_data`. For some reason `update_meta_data` causes duplicate keys.
$object->add_meta_data( $meta_key, $meta_data, true );
}
/**
* Returns a field value for a given object.
*
* @param string $key The field key.
* @param WC_Customer $customer The customer to get the field value for.
* @param string $group The group to get the field value for (shipping|billing|'') in which '' refers to the additional group.
*
* @return mixed The field value.
*/
public function get_field_from_customer( $key, $customer, $group = '' ) {
return $this->get_field_from_object( $key, $customer, $group );
}
/**
* Returns a field value for a given order.
*
* @param string $field The field key.
* @param WC_Order $order The order to get the field value for.
* @param string $group The group to get the field value for (shipping|billing|'') in which '' refers to the additional group.
*
* @return mixed The field value.
*/
public function get_field_from_order( $field, $order, $group = '' ) {
return $this->get_field_from_object( $field, $order, $group );
}
/**
* Returns a field value for a given object.
*
* @param string $key The field key.
* @param WC_Customer|WC_Order $object The customer to get the field value for.
* @param string $group The group to get the field value for (shipping|billing|'') in which '' refers to the additional group.
*
* @return mixed The field value.
*/
private function get_field_from_object( $key, $object, $group = '' ) {
$meta_key = '';
if ( 0 === strpos( $key, '/billing/' ) || 'billing' === $group ) {
$meta_key = self::BILLING_FIELDS_KEY;
$key = str_replace( '/billing/', '', $key );
} elseif ( 0 === strpos( $key, '/shipping/' ) || 'shipping' === $group ) {
$meta_key = self::SHIPPING_FIELDS_KEY;
$key = str_replace( '/shipping/', '', $key );
} else {
$meta_key = self::ADDITIONAL_FIELDS_KEY;
}
$meta_data = $object->get_meta( $meta_key, true );
if ( ! is_array( $meta_data ) ) {
return '';
}
if ( ! isset( $meta_data[ $key ] ) ) {
return '';
}
return $meta_data[ $key ];
}
/**
* Returns an array of all fields values for a given customer.
*
* @param WC_Customer $customer The customer 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_customer( $customer, $all = false ) {
$meta_data = array(
'billing' => array(),
'shipping' => array(),
'additional' => array(),
);
if ( $customer instanceof WC_Customer ) {
$meta_data['billing'] = $customer->get_meta( self::BILLING_FIELDS_KEY, true );
$meta_data['shipping'] = $customer->get_meta( self::SHIPPING_FIELDS_KEY, true );
$meta_data['additional'] = $customer->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 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 = array_merge(
$this->get_address_fields_keys(),
$this->get_contact_fields_keys(),
);
return array_filter(
$fields,
function( $key ) use ( $customer_fields_keys ) {
if ( 0 === strpos( $key, '/billing/' ) ) {
$key = str_replace( '/billing/', '', $key );
} elseif ( 0 === strpos( $key, '/shipping/' ) ) {
$key = str_replace( '/shipping/', '', $key );
}
return in_array( $key, $customer_fields_keys, true );
},
ARRAY_FILTER_USE_KEY
);
}
/**
* From a set of fields, returns only the ones for a given location.
*
* @param array $fields The fields to filter.
* @param string $location The location to validate the field for (address|contact|additional).
* @return array The filtered fields.
*/
public function filter_fields_for_location( $fields, $location ) {
return array_filter(
$fields,
function( $key ) use ( $location ) {
if ( 0 === strpos( $key, '/billing/' ) ) {
$key = str_replace( '/billing/', '', $key );
} elseif ( 0 === strpos( $key, '/shipping/' ) ) {
$key = str_replace( '/shipping/', '', $key );
}
return $this->is_field( $key ) && $this->get_field_location( $key ) === $location;
},
ARRAY_FILTER_USE_KEY
);
}
/**
* Filter fields for order confirmation.
*
* @param array $fields The fields to filter.
* @return array The filtered fields.
*/
public function filter_fields_for_order_confirmation( $fields ) {
return array_filter(
$fields,
function( $field ) {
return ! empty( $field['show_in_order_confirmation'] );
}
);
}
/**
* Get additional fields for an order.
*
* @param WC_Order $order Order object.
* @param string $location The location to get fields for (address|contact|additional).
* @param string $group The group to get the field value for (shipping|billing|'') in which '' refers to the additional group.
* @param string $context The context to get the field value for (edit|view).
* @return array An array of fields definitions as well as their values formatted for display.
*/
public function get_order_additional_fields_with_values( $order, $location, $group = '', $context = 'edit' ) {
$fields = $this->get_fields_for_location( $location );
$fields_with_values = array();
foreach ( $fields as $field_key => $field ) {
$value = $this->get_field_from_order( $field_key, $order, $group );
if ( '' === $value || null === $value ) {
continue;
}
if ( 'view' === $context ) {
$value = $this->format_additional_field_value( $value, $field );
}
$field['value'] = $value;
$fields_with_values[ $field_key ] = $field;
}
return $fields_with_values;
}
/**
* Formats a raw field value for display based on its type definition.
*
* @param string $value Value to format.
* @param array $field Additional field definition.
* @return string
*/
public function format_additional_field_value( $value, $field ) {
if ( 'checkbox' === $field['type'] ) {
$value = $value ? __( 'Yes', 'woocommerce' ) : __( 'No', 'woocommerce' );
}
if ( 'select' === $field['type'] ) {
$options = array_column( $field['options'], 'label', 'value' );
$value = isset( $options[ $value ] ) ? $options[ $value ] : $value;
}
return $value;
}
}
Fatal error: Uncaught Error: Class 'Automattic\WooCommerce\Blocks\Domain\Services\CheckoutFields' not found in /home/merciket/public_html/wp-content/plugins/woocommerce/src/Blocks/Domain/Bootstrap.php:316
Stack trace:
#0 /home/merciket/public_html/wp-content/plugins/woocommerce/src/Blocks/Registry/AbstractDependencyType.php(42): Automattic\WooCommerce\Blocks\Domain\Bootstrap->Automattic\WooCommerce\Blocks\Domain\{closure}(Object(Automattic\WooCommerce\Blocks\Registry\Container))
#1 /home/merciket/public_html/wp-content/plugins/woocommerce/src/Blocks/Registry/SharedType.php(28): Automattic\WooCommerce\Blocks\Registry\AbstractDependencyType->resolve_value(Object(Automattic\WooCommerce\Blocks\Registry\Container))
#2 /home/merciket/public_html/wp-content/plugins/woocommerce/src/Blocks/Registry/Container.php(96): Automattic\WooCommerce\Blocks\Registry\SharedType->get(Object(Automattic\WooCommerce\Blocks\Registry\Container))
#3 /home/merciket/public_html/wp-content/plugins/woocommerce/src/Blocks/Domain/Bootstrap.php(132): Autom in /home/merciket/public_html/wp-content/plugins/woocommerce/src/Blocks/Domain/Bootstrap.php on line 316