Handle meta data and fix unit tests

This commit is contained in:
Mike Jolley 2016-08-31 15:43:34 +01:00
parent 1595cc5767
commit d9a0d0988b
9 changed files with 201 additions and 110 deletions

View File

@ -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. * Read Meta Data from the database. Ignore any internal properties.
* @since 2.6.0 * @since 2.6.0
@ -296,10 +306,8 @@ abstract class WC_Data {
", $this->get_id() ) ); ", $this->get_id() ) );
if ( $raw_meta_data ) { if ( $raw_meta_data ) {
$raw_meta_data = array_filter( $raw_meta_data, array( $this, 'exclude_internal_meta_keys' ) );
foreach ( $raw_meta_data as $meta ) { foreach ( $raw_meta_data as $meta ) {
if ( in_array( $meta->meta_key, $this->get_internal_meta_keys() ) ) {
continue;
}
$this->_meta_data[] = (object) array( $this->_meta_data[] = (object) array(
'id' => (int) $meta->{ $db_info['meta_id_field'] }, 'id' => (int) $meta->{ $db_info['meta_id_field'] },
'key' => $meta->meta_key, 'key' => $meta->meta_key,
@ -390,6 +398,9 @@ abstract class WC_Data {
foreach ( $props as $prop => $value ) { foreach ( $props as $prop => $value ) {
try { try {
if ( 'meta_data' === $prop ) {
continue;
}
$setter = "set_$prop"; $setter = "set_$prop";
if ( ! is_null( $value ) && is_callable( array( $this, $setter ) ) ) { if ( ! is_null( $value ) && is_callable( array( $this, $setter ) ) ) {
$this->{$setter}( $value ); $this->{$setter}( $value );

View File

@ -495,6 +495,29 @@ class WC_REST_Coupons_Controller extends WC_REST_Posts_Controller {
'context' => array( 'view', 'edit' ), 'context' => array( 'view', 'edit' ),
'readonly' => true, '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 ); return $this->add_additional_fields_schema( $schema );

View File

@ -507,7 +507,7 @@ class WC_REST_Customers_Controller extends WC_REST_Controller {
if ( $last_order_data = $customer->get_last_order() ) { if ( $last_order_data = $customer->get_last_order() ) {
$data['last_order'] = array( $data['last_order'] = array(
'id' => $last_order_data->get_id(), '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 ) { protected function update_customer_meta_fields( $customer, $request ) {
$schema = $this->get_item_schema(); $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. // Customer first name.
if ( isset( $request['first_name'] ) ) { if ( isset( $request['first_name'] ) ) {
$customer->set_first_name( wc_clean( $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' ),
),
),
),
), ),
); );

View File

@ -79,9 +79,10 @@ class WC_Customer extends WC_Legacy_Customer {
'shipping_address_2', 'shipping_state', 'shipping_country', 'paying_customer', 'shipping_address_2', 'shipping_state', 'shipping_country', 'paying_customer',
'last_update', 'first_name', 'last_name', 'show_admin_bar_front', 'last_update', 'first_name', 'last_name', 'show_admin_bar_front',
'use_ssl', 'admin_color', 'rich_editing', 'comment_shortcuts', 'dismissed_wp_pointers', 'show_welcome_panel', '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', '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; $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 * @return mixed
*/ */
private function flatten_post_meta( $value ) { 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_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( $this->set_props( array(
'is_paying_customer' => get_user_meta( $id, 'paying_customer', true ), 'is_paying_customer' => get_user_meta( $id, 'paying_customer', true ),
'email' => $user_object->user_email, 'email' => $user_object->user_email,
@ -1113,12 +1114,10 @@ class WC_Customer extends WC_Legacy_Customer {
* @since 2.7.0 * @since 2.7.0
*/ */
public function update() { public function update() {
$customer_ID = $this->get_id(); wp_update_user( array( 'ID' => $this->get_id(), 'user_email' => $this->get_email() ) );
wp_update_user( array( 'ID' => $customer_ID, 'user_email' => $this->get_email() ) );
// Only update password if a new one was set with set_password // Only update password if a new one was set with set_password
if ( ! empty( $this->_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 = ''; $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 );
}
} }

View File

@ -20,7 +20,7 @@ abstract class WC_Legacy_Customer extends WC_Data {
*/ */
public function __isset( $key ) { public function __isset( $key ) {
$legacy_keys = array( $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', 'shipping_postcode', 'shipping_city', 'shipping_address_1', 'shipping_address', 'shipping_address_2', 'is_vat_exempt', 'calculated_shipping',
); );
$key = $this->filter_legacy_key( $key ); $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' ) ) ) { if ( in_array( $key, array( 'country', 'state', 'postcode' ,'city', 'address_1', 'address', 'address_2' ) ) ) {
$key = 'billing_' . $key; $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' ); _doing_it_wrong( $key, 'Customer properties should not be set directly.', '2.7' );
$key = $this->filter_legacy_key( $key ); $key = $this->filter_legacy_key( $key );
if ( is_callable( $this, "set_{$key}" ) ) { if ( is_callable( array( $this, "set_{$key}" ) ) ) {
$this->{"set_{$key}"}( $value ); $this->{"set_{$key}"}( $value );
} }
} }

View File

@ -60,7 +60,7 @@ class WC_Helper_Customer {
$customer->set_username( $username ); $customer->set_username( $username );
$customer->set_password( $password ); $customer->set_password( $password );
$customer->set_email( $email ); $customer->set_email( $email );
$customer->create(); $customer->save();
return $customer; return $customer;
} }

View File

@ -406,7 +406,7 @@ class WC_Tests_API_Coupons extends WC_REST_Unit_Test_Case {
$data = $response->get_data(); $data = $response->get_data();
$properties = $data['schema']['properties']; $properties = $data['schema']['properties'];
$this->assertEquals( 23, count( $properties ) ); $this->assertEquals( 24, count( $properties ) );
$this->assertArrayHasKey( 'id', $properties ); $this->assertArrayHasKey( 'id', $properties );
$this->assertArrayHasKey( 'code', $properties ); $this->assertArrayHasKey( 'code', $properties );
$this->assertArrayHasKey( 'date_created', $properties ); $this->assertArrayHasKey( 'date_created', $properties );

View File

@ -58,10 +58,6 @@ class Customers extends WC_REST_Unit_Test_Case {
'first_name' => 'Justin', 'first_name' => 'Justin',
'last_name' => '', 'last_name' => '',
'username' => 'testcustomer', 'username' => 'testcustomer',
'last_order' => null,
'orders_count' => 0,
'total_spent' => '0.00',
'avatar_url' => $customer_1->get_avatar_url(),
'billing' => array( 'billing' => array(
'first_name' => '', 'first_name' => '',
'last_name' => '', 'last_name' => '',
@ -86,6 +82,12 @@ class Customers extends WC_REST_Unit_Test_Case {
'postcode' => '19123', 'postcode' => '19123',
'country' => 'US', '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( '_links' => array(
'self' => array( 'self' => array(
array( array(
@ -139,10 +141,6 @@ class Customers extends WC_REST_Unit_Test_Case {
'first_name' => '', 'first_name' => '',
'last_name' => '', 'last_name' => '',
'username' => 'create_customer_test', 'username' => 'create_customer_test',
'last_order' => null,
'orders_count' => 0,
'total_spent' => '0',
'avatar_url' => $data['avatar_url'],
'billing' => array( 'billing' => array(
'first_name' => '', 'first_name' => '',
'last_name' => '', 'last_name' => '',
@ -167,6 +165,12 @@ class Customers extends WC_REST_Unit_Test_Case {
'postcode' => '', 'postcode' => '',
'country' => '', 'country' => '',
), ),
'is_paying_customer' => false,
'meta_data' => array(),
'last_order' => null,
'orders_count' => 0,
'total_spent' => '0.00',
'avatar_url' => $data['avatar_url'],
), $data ); ), $data );
// Test extra data // Test extra data
@ -198,10 +202,6 @@ class Customers extends WC_REST_Unit_Test_Case {
'first_name' => 'Test', 'first_name' => 'Test',
'last_name' => 'McTestFace', 'last_name' => 'McTestFace',
'username' => 'create_customer_test2', 'username' => 'create_customer_test2',
'last_order' => null,
'orders_count' => 0,
'total_spent' => '0',
'avatar_url' => $data['avatar_url'],
'billing' => array( 'billing' => array(
'first_name' => '', 'first_name' => '',
'last_name' => '', 'last_name' => '',
@ -226,6 +226,12 @@ class Customers extends WC_REST_Unit_Test_Case {
'postcode' => '', 'postcode' => '',
'country' => 'US', '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 ); ), $data );
// Test without required field // Test without required field
@ -275,12 +281,6 @@ class Customers extends WC_REST_Unit_Test_Case {
'date_modified' => $data['date_modified'], 'date_modified' => $data['date_modified'],
'email' => 'get_customer_test@woo.local', 'email' => 'get_customer_test@woo.local',
'first_name' => 'Justin', '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( 'billing' => array(
'first_name' => '', 'first_name' => '',
'last_name' => '', 'last_name' => '',
@ -305,6 +305,14 @@ class Customers extends WC_REST_Unit_Test_Case {
'postcode' => '19123', 'postcode' => '19123',
'country' => 'US', '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 ); ), $data );
} }
@ -483,7 +491,7 @@ class Customers extends WC_REST_Unit_Test_Case {
$data = $response->get_data(); $data = $response->get_data();
$properties = $data['schema']['properties']; $properties = $data['schema']['properties'];
$this->assertEquals( 14, count( $properties ) ); $this->assertEquals( 16, count( $properties ) );
$this->assertArrayHasKey( 'id', $properties ); $this->assertArrayHasKey( 'id', $properties );
$this->assertArrayHasKey( 'date_created', $properties ); $this->assertArrayHasKey( 'date_created', $properties );
$this->assertArrayHasKey( 'date_modified', $properties ); $this->assertArrayHasKey( 'date_modified', $properties );

View File

@ -110,8 +110,6 @@ class WC_Tests_CustomerCRUD extends WC_Unit_Test_Case {
/** /**
* Tests backwards compat / legacy handling. * 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_country
* @expectedDeprecated WC_Customer::get_default_state * @expectedDeprecated WC_Customer::get_default_state
* @expectedDeprecated WC_Customer::is_paying_customer * @expectedDeprecated WC_Customer::is_paying_customer