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.
|
* 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 );
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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' ),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -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 );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue