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.
* @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 );

View File

@ -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 );

View File

@ -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' ),
),
),
),
),
);

View File

@ -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 );
}
}

View File

@ -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 );
}
}

View File

@ -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;
}

View File

@ -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 );

View File

@ -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 );

View File

@ -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