Handle meta data and fix unit tests
This commit is contained in:
parent
1595cc5767
commit
d9a0d0988b
|
@ -264,6 +264,16 @@ abstract class WC_Data {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback to remove unwanted meta data.
|
||||
*
|
||||
* @param object $meta
|
||||
* @return bool
|
||||
*/
|
||||
protected function exclude_internal_meta_keys( $meta ) {
|
||||
return ! in_array( $meta->meta_key, $this->get_internal_meta_keys() );
|
||||
}
|
||||
|
||||
/**
|
||||
* Read Meta Data from the database. Ignore any internal properties.
|
||||
* @since 2.6.0
|
||||
|
@ -296,10 +306,8 @@ abstract class WC_Data {
|
|||
", $this->get_id() ) );
|
||||
|
||||
if ( $raw_meta_data ) {
|
||||
$raw_meta_data = array_filter( $raw_meta_data, array( $this, 'exclude_internal_meta_keys' ) );
|
||||
foreach ( $raw_meta_data as $meta ) {
|
||||
if ( in_array( $meta->meta_key, $this->get_internal_meta_keys() ) ) {
|
||||
continue;
|
||||
}
|
||||
$this->_meta_data[] = (object) array(
|
||||
'id' => (int) $meta->{ $db_info['meta_id_field'] },
|
||||
'key' => $meta->meta_key,
|
||||
|
@ -390,6 +398,9 @@ abstract class WC_Data {
|
|||
|
||||
foreach ( $props as $prop => $value ) {
|
||||
try {
|
||||
if ( 'meta_data' === $prop ) {
|
||||
continue;
|
||||
}
|
||||
$setter = "set_$prop";
|
||||
if ( ! is_null( $value ) && is_callable( array( $this, $setter ) ) ) {
|
||||
$this->{$setter}( $value );
|
||||
|
|
|
@ -495,6 +495,29 @@ class WC_REST_Coupons_Controller extends WC_REST_Posts_Controller {
|
|||
'context' => array( 'view', 'edit' ),
|
||||
'readonly' => true,
|
||||
),
|
||||
'meta_data' => array(
|
||||
'description' => __( 'Order meta data.', 'woocommerce' ),
|
||||
'type' => 'array',
|
||||
'context' => array( 'view', 'edit' ),
|
||||
'properties' => array(
|
||||
'id' => array(
|
||||
'description' => __( 'Meta ID.', 'woocommerce' ),
|
||||
'type' => 'int',
|
||||
'context' => array( 'view', 'edit' ),
|
||||
'readonly' => true,
|
||||
),
|
||||
'key' => array(
|
||||
'description' => __( 'Meta key.', 'woocommerce' ),
|
||||
'type' => 'string',
|
||||
'context' => array( 'view', 'edit' ),
|
||||
),
|
||||
'value' => array(
|
||||
'description' => __( 'Meta value.', 'woocommerce' ),
|
||||
'type' => 'string',
|
||||
'context' => array( 'view', 'edit' ),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
return $this->add_additional_fields_schema( $schema );
|
||||
|
|
|
@ -507,7 +507,7 @@ class WC_REST_Customers_Controller extends WC_REST_Controller {
|
|||
if ( $last_order_data = $customer->get_last_order() ) {
|
||||
$data['last_order'] = array(
|
||||
'id' => $last_order_data->get_id(),
|
||||
'date' => wc_rest_prepare_date_response( $last_order_data->get_date_created() ),
|
||||
'date' => $last_order_data->get_date_created() ? wc_rest_prepare_date_response( $last_order_data->get_date_created() ) : null,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -536,6 +536,15 @@ class WC_REST_Customers_Controller extends WC_REST_Controller {
|
|||
protected function update_customer_meta_fields( $customer, $request ) {
|
||||
$schema = $this->get_item_schema();
|
||||
|
||||
// Meta data
|
||||
if ( isset( $request['meta_data'] ) ) {
|
||||
if ( is_array( $request['meta_data'] ) ) {
|
||||
foreach ( $request['meta_data'] as $meta ) {
|
||||
$coupon->update_meta_data( $meta['key'], $meta['value'], $meta['id'] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Customer first name.
|
||||
if ( isset( $request['first_name'] ) ) {
|
||||
$customer->set_first_name( wc_clean( $request['first_name'] ) );
|
||||
|
@ -801,6 +810,35 @@ class WC_REST_Customers_Controller extends WC_REST_Controller {
|
|||
),
|
||||
),
|
||||
),
|
||||
'is_paying_customer' => array(
|
||||
'description' => __( 'Is the customer a paying customer?', 'woocommerce' ),
|
||||
'type' => 'bool',
|
||||
'context' => array( 'view', 'edit' ),
|
||||
'readonly' => true,
|
||||
),
|
||||
'meta_data' => array(
|
||||
'description' => __( 'Order meta data.', 'woocommerce' ),
|
||||
'type' => 'array',
|
||||
'context' => array( 'view', 'edit' ),
|
||||
'properties' => array(
|
||||
'id' => array(
|
||||
'description' => __( 'Meta ID.', 'woocommerce' ),
|
||||
'type' => 'int',
|
||||
'context' => array( 'view', 'edit' ),
|
||||
'readonly' => true,
|
||||
),
|
||||
'key' => array(
|
||||
'description' => __( 'Meta key.', 'woocommerce' ),
|
||||
'type' => 'string',
|
||||
'context' => array( 'view', 'edit' ),
|
||||
),
|
||||
'value' => array(
|
||||
'description' => __( 'Meta value.', 'woocommerce' ),
|
||||
'type' => 'string',
|
||||
'context' => array( 'view', 'edit' ),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
|
|
|
@ -79,9 +79,10 @@ class WC_Customer extends WC_Legacy_Customer {
|
|||
'shipping_address_2', 'shipping_state', 'shipping_country', 'paying_customer',
|
||||
'last_update', 'first_name', 'last_name', 'show_admin_bar_front',
|
||||
'use_ssl', 'admin_color', 'rich_editing', 'comment_shortcuts', 'dismissed_wp_pointers', 'show_welcome_panel',
|
||||
'_woocommerce_persistent_cart', 'session_tokens',
|
||||
'_woocommerce_persistent_cart', 'session_tokens', 'nickname', 'description',
|
||||
'billing_first_name', 'billing_last_name', 'billing_company', 'billing_phone', 'billing_email',
|
||||
'shipping_first_name', 'shipping_last_name', 'shipping_company',
|
||||
'shipping_first_name', 'shipping_last_name', 'shipping_company', 'default_password_nag',
|
||||
'primary_blog', 'source_domain',
|
||||
);
|
||||
|
||||
/**
|
||||
|
@ -244,7 +245,7 @@ class WC_Customer extends WC_Legacy_Customer {
|
|||
$spent = 0;
|
||||
}
|
||||
|
||||
return wc_format_decimal( $spent );
|
||||
return wc_format_decimal( $spent, 2 );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1072,7 +1073,7 @@ class WC_Customer extends WC_Legacy_Customer {
|
|||
* @return mixed
|
||||
*/
|
||||
private function flatten_post_meta( $value ) {
|
||||
return current( $value );
|
||||
return is_array( $value ) ? current( $value ) : $value;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1096,7 +1097,7 @@ class WC_Customer extends WC_Legacy_Customer {
|
|||
}
|
||||
|
||||
$this->set_id( $user_object->ID );
|
||||
$this->set_props( array_map( array( $this, 'flatten_post_meta'), get_post_meta( $id ) ) );
|
||||
$this->set_props( array_map( array( $this, 'flatten_post_meta'), get_user_meta( $id ) ) );
|
||||
$this->set_props( array(
|
||||
'is_paying_customer' => get_user_meta( $id, 'paying_customer', true ),
|
||||
'email' => $user_object->user_email,
|
||||
|
@ -1113,12 +1114,10 @@ class WC_Customer extends WC_Legacy_Customer {
|
|||
* @since 2.7.0
|
||||
*/
|
||||
public function update() {
|
||||
$customer_ID = $this->get_id();
|
||||
|
||||
wp_update_user( array( 'ID' => $customer_ID, 'user_email' => $this->get_email() ) );
|
||||
wp_update_user( array( 'ID' => $this->get_id(), 'user_email' => $this->get_email() ) );
|
||||
// Only update password if a new one was set with set_password
|
||||
if ( ! empty( $this->_password ) ) {
|
||||
wp_update_user( array( 'ID' => $customer_ID, 'user_pass' => $this->_password ) );
|
||||
wp_update_user( array( 'ID' => $this->get_id(), 'user_pass' => $this->_password ) );
|
||||
$this->_password = '';
|
||||
}
|
||||
|
||||
|
@ -1211,4 +1210,18 @@ class WC_Customer extends WC_Legacy_Customer {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback to remove unwanted meta data.
|
||||
*
|
||||
* @param object $meta
|
||||
* @return bool
|
||||
*/
|
||||
protected function exclude_internal_meta_keys( $meta ) {
|
||||
global $wpdb;
|
||||
return ! in_array( $meta->meta_key, $this->get_internal_meta_keys() )
|
||||
&& 0 !== strpos( $meta->meta_key, 'closedpostboxes_' )
|
||||
&& 0 !== strpos( $meta->meta_key, 'metaboxhidden_' )
|
||||
&& 0 !== strpos( $meta->meta_key, 'manageedit-' )
|
||||
&& ! strstr( $meta->meta_key, $wpdb->prefix );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@ abstract class WC_Legacy_Customer extends WC_Data {
|
|||
*/
|
||||
public function __isset( $key ) {
|
||||
$legacy_keys = array(
|
||||
'country', 'state', 'postcode' ,'city', 'address_1', 'address', 'address_2', 'shipping_country', 'shipping_state',
|
||||
'id', 'country', 'state', 'postcode' ,'city', 'address_1', 'address', 'address_2', 'shipping_country', 'shipping_state',
|
||||
'shipping_postcode', 'shipping_city', 'shipping_address_1', 'shipping_address', 'shipping_address_2', 'is_vat_exempt', 'calculated_shipping',
|
||||
);
|
||||
$key = $this->filter_legacy_key( $key );
|
||||
|
@ -39,7 +39,7 @@ abstract class WC_Legacy_Customer extends WC_Data {
|
|||
if ( in_array( $key, array( 'country', 'state', 'postcode' ,'city', 'address_1', 'address', 'address_2' ) ) ) {
|
||||
$key = 'billing_' . $key;
|
||||
}
|
||||
return is_callable( $this, "get_{$key}" ) ? $this->{"get_{$key}"}() : '';
|
||||
return is_callable( array( $this, "get_{$key}" ) ) ? $this->{"get_{$key}"}() : '';
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -52,7 +52,7 @@ abstract class WC_Legacy_Customer extends WC_Data {
|
|||
_doing_it_wrong( $key, 'Customer properties should not be set directly.', '2.7' );
|
||||
$key = $this->filter_legacy_key( $key );
|
||||
|
||||
if ( is_callable( $this, "set_{$key}" ) ) {
|
||||
if ( is_callable( array( $this, "set_{$key}" ) ) ) {
|
||||
$this->{"set_{$key}"}( $value );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -60,7 +60,7 @@ class WC_Helper_Customer {
|
|||
$customer->set_username( $username );
|
||||
$customer->set_password( $password );
|
||||
$customer->set_email( $email );
|
||||
$customer->create();
|
||||
$customer->save();
|
||||
return $customer;
|
||||
}
|
||||
|
||||
|
|
|
@ -406,7 +406,7 @@ class WC_Tests_API_Coupons extends WC_REST_Unit_Test_Case {
|
|||
$data = $response->get_data();
|
||||
$properties = $data['schema']['properties'];
|
||||
|
||||
$this->assertEquals( 23, count( $properties ) );
|
||||
$this->assertEquals( 24, count( $properties ) );
|
||||
$this->assertArrayHasKey( 'id', $properties );
|
||||
$this->assertArrayHasKey( 'code', $properties );
|
||||
$this->assertArrayHasKey( 'date_created', $properties );
|
||||
|
|
|
@ -58,10 +58,6 @@ class Customers extends WC_REST_Unit_Test_Case {
|
|||
'first_name' => 'Justin',
|
||||
'last_name' => '',
|
||||
'username' => 'testcustomer',
|
||||
'last_order' => null,
|
||||
'orders_count' => 0,
|
||||
'total_spent' => '0.00',
|
||||
'avatar_url' => $customer_1->get_avatar_url(),
|
||||
'billing' => array(
|
||||
'first_name' => '',
|
||||
'last_name' => '',
|
||||
|
@ -86,6 +82,12 @@ class Customers extends WC_REST_Unit_Test_Case {
|
|||
'postcode' => '19123',
|
||||
'country' => 'US',
|
||||
),
|
||||
'is_paying_customer' => false,
|
||||
'last_order' => null,
|
||||
'orders_count' => 0,
|
||||
'total_spent' => '0.00',
|
||||
'avatar_url' => $customer_1->get_avatar_url(),
|
||||
'meta_data' => array(),
|
||||
'_links' => array(
|
||||
'self' => array(
|
||||
array(
|
||||
|
@ -139,10 +141,6 @@ class Customers extends WC_REST_Unit_Test_Case {
|
|||
'first_name' => '',
|
||||
'last_name' => '',
|
||||
'username' => 'create_customer_test',
|
||||
'last_order' => null,
|
||||
'orders_count' => 0,
|
||||
'total_spent' => '0',
|
||||
'avatar_url' => $data['avatar_url'],
|
||||
'billing' => array(
|
||||
'first_name' => '',
|
||||
'last_name' => '',
|
||||
|
@ -167,6 +165,12 @@ class Customers extends WC_REST_Unit_Test_Case {
|
|||
'postcode' => '',
|
||||
'country' => '',
|
||||
),
|
||||
'is_paying_customer' => false,
|
||||
'meta_data' => array(),
|
||||
'last_order' => null,
|
||||
'orders_count' => 0,
|
||||
'total_spent' => '0.00',
|
||||
'avatar_url' => $data['avatar_url'],
|
||||
), $data );
|
||||
|
||||
// Test extra data
|
||||
|
@ -198,10 +202,6 @@ class Customers extends WC_REST_Unit_Test_Case {
|
|||
'first_name' => 'Test',
|
||||
'last_name' => 'McTestFace',
|
||||
'username' => 'create_customer_test2',
|
||||
'last_order' => null,
|
||||
'orders_count' => 0,
|
||||
'total_spent' => '0',
|
||||
'avatar_url' => $data['avatar_url'],
|
||||
'billing' => array(
|
||||
'first_name' => '',
|
||||
'last_name' => '',
|
||||
|
@ -226,6 +226,12 @@ class Customers extends WC_REST_Unit_Test_Case {
|
|||
'postcode' => '',
|
||||
'country' => 'US',
|
||||
),
|
||||
'is_paying_customer' => false,
|
||||
'meta_data' => array(),
|
||||
'last_order' => null,
|
||||
'orders_count' => 0,
|
||||
'total_spent' => '0.00',
|
||||
'avatar_url' => $data['avatar_url'],
|
||||
), $data );
|
||||
|
||||
// Test without required field
|
||||
|
@ -275,12 +281,6 @@ class Customers extends WC_REST_Unit_Test_Case {
|
|||
'date_modified' => $data['date_modified'],
|
||||
'email' => 'get_customer_test@woo.local',
|
||||
'first_name' => 'Justin',
|
||||
'last_name' => '',
|
||||
'username' => 'get_customer_test',
|
||||
'last_order' => null,
|
||||
'orders_count' => 0,
|
||||
'total_spent' => '0.00',
|
||||
'avatar_url' => $data['avatar_url'],
|
||||
'billing' => array(
|
||||
'first_name' => '',
|
||||
'last_name' => '',
|
||||
|
@ -305,6 +305,14 @@ class Customers extends WC_REST_Unit_Test_Case {
|
|||
'postcode' => '19123',
|
||||
'country' => 'US',
|
||||
),
|
||||
'is_paying_customer' => false,
|
||||
'meta_data' => array(),
|
||||
'last_name' => '',
|
||||
'username' => 'get_customer_test',
|
||||
'last_order' => null,
|
||||
'orders_count' => 0,
|
||||
'total_spent' => '0.00',
|
||||
'avatar_url' => $data['avatar_url'],
|
||||
), $data );
|
||||
}
|
||||
|
||||
|
@ -483,7 +491,7 @@ class Customers extends WC_REST_Unit_Test_Case {
|
|||
$data = $response->get_data();
|
||||
$properties = $data['schema']['properties'];
|
||||
|
||||
$this->assertEquals( 14, count( $properties ) );
|
||||
$this->assertEquals( 16, count( $properties ) );
|
||||
$this->assertArrayHasKey( 'id', $properties );
|
||||
$this->assertArrayHasKey( 'date_created', $properties );
|
||||
$this->assertArrayHasKey( 'date_modified', $properties );
|
||||
|
|
|
@ -110,8 +110,6 @@ class WC_Tests_CustomerCRUD extends WC_Unit_Test_Case {
|
|||
|
||||
/**
|
||||
* Tests backwards compat / legacy handling.
|
||||
* @expectedDeprecated WC_Customer::is_vat_exempt
|
||||
* @expectedDeprecated WC_Customer::has_calculated_shipping
|
||||
* @expectedDeprecated WC_Customer::get_default_country
|
||||
* @expectedDeprecated WC_Customer::get_default_state
|
||||
* @expectedDeprecated WC_Customer::is_paying_customer
|
||||
|
|
Loading…
Reference in New Issue