diff --git a/composer.json b/composer.json index f3c6bd5f..e95783ae 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,7 @@ "license": "GPL-3.0", "authors": [ { - "name": "kidunot89", + "name": "Geoff Taylor", "email": "kidunot89@gmail.com", "role": "Lead developer" } @@ -31,6 +31,9 @@ "optimize-autoloader": true }, "autoload": { + "files":[ + "includes/connection/common-post-type-args.php" + ], "psr-4": { "WPGraphQL\\Extensions\\WooCommerce\\": "includes/" }, diff --git a/includes/class-type-registry.php b/includes/class-type-registry.php index 7ef7e580..010ef7d7 100644 --- a/includes/class-type-registry.php +++ b/includes/class-type-registry.php @@ -36,16 +36,17 @@ class Type_Registry { \WPGraphQL\Extensions\WooCommerce\Type\WPEnum\Stock_Status::register(); \WPGraphQL\Extensions\WooCommerce\Type\WPEnum\Tax_Class::register(); \WPGraphQL\Extensions\WooCommerce\Type\WPEnum\Tax_Status::register(); - \WPGraphQL\Extensions\WooCommerce\Type\WPEnum\WC_Connection_Orderby_Enum::register(); \WPGraphQL\Extensions\WooCommerce\Type\WPEnum\Tax_Rate_Connection_Orderby_Enum::register(); \WPGraphQL\Extensions\WooCommerce\Type\WPEnum\Pricing_Field_Format::register(); \WPGraphQL\Extensions\WooCommerce\Type\WPEnum\Product_Taxonomy::register(); \WPGraphQL\Extensions\WooCommerce\Type\WPEnum\Taxonomy_Operator::register(); + \WPGraphQL\Extensions\WooCommerce\Type\WPEnum\Post_Type_Orderby_Enum::register(); + \WPGraphQL\Extensions\WooCommerce\Type\WPEnum\Products_Orderby_Enum::register(); + \WPGraphQL\Extensions\WooCommerce\Type\WPEnum\Orders_Orderby_Enum::register(); // InputObjects. \WPGraphQL\Extensions\WooCommerce\Type\WPInputObject\Customer_Address_Input::register(); \WPGraphQL\Extensions\WooCommerce\Type\WPInputObject\Product_Attribute_Input::register(); - \WPGraphQL\Extensions\WooCommerce\Type\WPInputObject\WC_Connection_Orderby_Input::register(); \WPGraphQL\Extensions\WooCommerce\Type\WPInputObject\Tax_Rate_Connection_Orderby_Input::register(); \WPGraphQL\Extensions\WooCommerce\Type\WPInputObject\Fee_Line_Input::register(); \WPGraphQL\Extensions\WooCommerce\Type\WPInputObject\Line_Item_Input::register(); @@ -55,6 +56,7 @@ class Type_Registry { \WPGraphQL\Extensions\WooCommerce\Type\WPInputObject\Cart_Item_Quantity_Input::register(); \WPGraphQL\Extensions\WooCommerce\Type\WPInputObject\Product_Taxonomy_Filter_Input::register(); \WPGraphQL\Extensions\WooCommerce\Type\WPInputObject\Product_Taxonomy_Filter_Relation_Input::register(); + \WPGraphQL\Extensions\WooCommerce\Type\WPInputObject\Orderby_Inputs::register(); // Objects. \WPGraphQL\Extensions\WooCommerce\Type\WPObject\Coupon_Type::register(); diff --git a/includes/connection/class-coupons.php b/includes/connection/class-coupons.php index e6743e50..0776a7be 100644 --- a/includes/connection/class-coupons.php +++ b/includes/connection/class-coupons.php @@ -14,7 +14,7 @@ use WPGraphQL\Extensions\WooCommerce\Data\Factory; /** * Class - Coupons */ -class Coupons extends WC_Connection { +class Coupons { /** * Registers the various connections from other Types to Coupon */ @@ -65,7 +65,7 @@ class Coupons extends WC_Connection { */ public static function get_connection_args() { return array_merge( - self::get_shared_connection_args(), + get_common_post_type_args(), array( 'code' => array( 'type' => 'String', diff --git a/includes/connection/class-orders.php b/includes/connection/class-orders.php index ec7ef581..a96f63ec 100644 --- a/includes/connection/class-orders.php +++ b/includes/connection/class-orders.php @@ -14,7 +14,7 @@ use WPGraphQL\Extensions\WooCommerce\Data\Factory; /** * Class - Orders */ -class Orders extends WC_Connection { +class Orders { /** * Registers the various connections from other Types to Customer */ @@ -64,7 +64,7 @@ class Orders extends WC_Connection { */ public static function get_connection_args() { return array_merge( - self::get_shared_connection_args(), + get_common_post_type_args(), array( 'statuses' => array( 'type' => array( 'list_of' => 'OrderStatusEnum' ), @@ -82,6 +82,10 @@ class Orders extends WC_Connection { 'type' => 'Int', 'description' => __( 'Limit result set to orders assigned a specific product.', 'wp-graphql-woocommerce' ), ), + 'orderby' => array( + 'type' => array( 'list_of' => 'OrdersOrderbyInput' ), + 'description' => __( 'What paramater to use to order the objects by.', 'wp-graphql-woocommerce' ), + ), ) ); } diff --git a/includes/connection/class-products.php b/includes/connection/class-products.php index f8a15dfb..8ebf7e05 100644 --- a/includes/connection/class-products.php +++ b/includes/connection/class-products.php @@ -14,7 +14,7 @@ use WPGraphQL\Extensions\WooCommerce\Data\Factory; /** * Class - Products */ -class Products extends WC_Connection { +class Products { /** * Registers the various connections from other Types to Product */ @@ -274,6 +274,10 @@ class Products extends WC_Connection { 'type' => array( 'list_of' => 'ProductTaxonomyFilterRelationInput' ), 'description' => __( 'Limit result set with complex set of taxonomy filters.', 'wp-graphql-woocommerce' ), ), + 'orderby' => array( + 'type' => array( 'list_of' => 'ProductsOrderbyInput' ), + 'description' => __( 'What paramater to use to order the objects by.', 'wp-graphql-woocommerce' ), + ), ); if ( wc_tax_enabled() ) { @@ -283,6 +287,6 @@ class Products extends WC_Connection { ); } - return array_merge( self::get_shared_connection_args(), $args ); + return array_merge( get_common_post_type_args(), $args ); } } diff --git a/includes/connection/class-refunds.php b/includes/connection/class-refunds.php index 05ce5287..0f5f53e4 100644 --- a/includes/connection/class-refunds.php +++ b/includes/connection/class-refunds.php @@ -14,7 +14,7 @@ use WPGraphQL\Extensions\WooCommerce\Data\Factory; /** * Class - Refunds */ -class Refunds extends WC_Connection { +class Refunds { /** * Registers the various connections from other Types to Refund */ @@ -66,7 +66,7 @@ class Refunds extends WC_Connection { */ public static function get_connection_args() { return array_merge( - self::get_shared_connection_args(), + get_common_post_type_args(), array( 'statuses' => array( 'type' => array( 'list_of' => 'String' ), diff --git a/includes/connection/class-wc-connection.php b/includes/connection/class-wc-connection.php deleted file mode 100644 index f22054ce..00000000 --- a/includes/connection/class-wc-connection.php +++ /dev/null @@ -1,58 +0,0 @@ - array( - 'type' => 'String', - 'description' => __( 'Limit results to those matching a string.', 'wp-graphql-woocommerce' ), - ), - 'exclude' => array( - 'type' => array( 'list_of' => 'Int' ), - 'description' => __( 'Ensure result set excludes specific IDs.', 'wp-graphql-woocommerce' ), - ), - 'include' => array( - 'type' => array( 'list_of' => 'Int' ), - 'description' => __( 'Limit result set to specific ids.', 'wp-graphql-woocommerce' ), - ), - 'orderby' => array( - 'type' => array( 'list_of' => 'WCConnectionOrderbyInput' ), - 'description' => __( 'What paramater to use to order the objects by.', 'wp-graphql-woocommerce' ), - ), - 'dateQuery' => array( - 'type' => 'DateQueryInput', - 'description' => __( 'Filter the connection based on dates', 'wp-graphql-woocommerce' ), - ), - 'parent' => array( - 'type' => 'Int', - 'description' => __( 'Use ID to return only children. Use 0 to return only top-level items', 'wp-graphql-woocommerce' ), - ), - 'parentIn' => array( - 'type' => array( 'list_of' => 'Int' ), - 'description' => __( 'Specify objects whose parent is in an array', 'wp-graphql-woocommerce' ), - ), - 'parentNotIn' => array( - 'type' => array( 'list_of' => 'Int' ), - 'description' => __( 'Specify objects whose parent is not in an array', 'wp-graphql-woocommerce' ), - ), - ); - } -} diff --git a/includes/connection/common-post-type-args.php b/includes/connection/common-post-type-args.php new file mode 100644 index 00000000..8f8dc331 --- /dev/null +++ b/includes/connection/common-post-type-args.php @@ -0,0 +1,52 @@ + array( + 'type' => 'String', + 'description' => __( 'Limit results to those matching a string.', 'wp-graphql-woocommerce' ), + ), + 'exclude' => array( + 'type' => array( 'list_of' => 'Int' ), + 'description' => __( 'Ensure result set excludes specific IDs.', 'wp-graphql-woocommerce' ), + ), + 'include' => array( + 'type' => array( 'list_of' => 'Int' ), + 'description' => __( 'Limit result set to specific ids.', 'wp-graphql-woocommerce' ), + ), + 'orderby' => array( + 'type' => array( 'list_of' => 'PostTypeOrderbyInput' ), + 'description' => __( 'What paramater to use to order the objects by.', 'wp-graphql-woocommerce' ), + ), + 'dateQuery' => array( + 'type' => 'DateQueryInput', + 'description' => __( 'Filter the connection based on dates', 'wp-graphql-woocommerce' ), + ), + 'parent' => array( + 'type' => 'Int', + 'description' => __( 'Use ID to return only children. Use 0 to return only top-level items', 'wp-graphql-woocommerce' ), + ), + 'parentIn' => array( + 'type' => array( 'list_of' => 'Int' ), + 'description' => __( 'Specify objects whose parent is in an array', 'wp-graphql-woocommerce' ), + ), + 'parentNotIn' => array( + 'type' => array( 'list_of' => 'Int' ), + 'description' => __( 'Specify objects whose parent is not in an array', 'wp-graphql-woocommerce' ), + ), + ); +} + diff --git a/includes/data/connection/class-coupon-connection-resolver.php b/includes/data/connection/class-coupon-connection-resolver.php index f43e05b1..4894b096 100644 --- a/includes/data/connection/class-coupon-connection-resolver.php +++ b/includes/data/connection/class-coupon-connection-resolver.php @@ -19,9 +19,7 @@ use WPGraphQL\Extension\WooCommerce\Model\Order; * Class Coupon_Connection_Resolver */ class Coupon_Connection_Resolver extends AbstractConnectionResolver { - use WC_Connection_Resolver { - sanitize_input_fields as sanitize_shared_input_fields; - } + use Common_CPT_Input_Sanitize_Functions; /** * The name of the post type, or array of post types the connection resolver is resolving for @@ -168,6 +166,15 @@ class Coupon_Connection_Resolver extends AbstractConnectionResolver { return ! empty( $this->query->posts ) ? $this->query->posts : []; } + /** + * Returns meta keys to be used for connection ordering. + * + * @return array + */ + public function ordering_meta() { + return array(); + } + /** * This sets up the "allowed" args, and translates the GraphQL-friendly keys to WP_Query * friendly keys. There's probably a cleaner/more dynamic way to approach this, but @@ -179,7 +186,7 @@ class Coupon_Connection_Resolver extends AbstractConnectionResolver { * @return array */ public function sanitize_input_fields( array $where_args ) { - $args = $this->sanitize_shared_input_fields( $where_args ); + $args = $this->sanitize_common_inputs( $where_args ); if ( ! empty( $where_args['code'] ) ) { $id = \wc_get_coupon_id_by_code( $where_args['code'] ); diff --git a/includes/data/connection/class-order-connection-resolver.php b/includes/data/connection/class-order-connection-resolver.php index bc7c35d6..a48371b8 100644 --- a/includes/data/connection/class-order-connection-resolver.php +++ b/includes/data/connection/class-order-connection-resolver.php @@ -19,9 +19,7 @@ use WPGraphQL\Extensions\WooCommerce\Model\Customer; * Class Order_Connection_Resolver */ class Order_Connection_Resolver extends AbstractConnectionResolver { - use WC_Connection_Resolver { - sanitize_input_fields as sanitize_shared_input_fields; - } + use Common_CPT_Input_Sanitize_Functions; /** * The name of the post type, or array of post types the connection resolver is resolving for @@ -169,6 +167,22 @@ class Order_Connection_Resolver extends AbstractConnectionResolver { return ! empty( $this->query->get_orders() ) ? $this->query->get_orders() : array(); } + /** + * Returns meta keys to be used for connection ordering. + * + * @return array + */ + public function ordering_meta() { + return array( + '_order_key', + '_cart_discount', + '_order_total', + '_order_tax', + '_date_paid', + '_date_completed', + ); + } + /** * This sets up the "allowed" args, and translates the GraphQL-friendly keys to WP_Query * friendly keys. There's probably a cleaner/more dynamic way to approach this, but @@ -181,7 +195,7 @@ class Order_Connection_Resolver extends AbstractConnectionResolver { */ public function sanitize_input_fields( array $where_args ) { global $wpdb; - $args = $this->sanitize_shared_input_fields( $where_args ); + $args = $this->sanitize_common_inputs( $where_args ); $key_mapping = array( 'post_parent' => 'parent', diff --git a/includes/data/connection/class-product-connection-resolver.php b/includes/data/connection/class-product-connection-resolver.php index fa5e9b7e..1f9631f5 100644 --- a/includes/data/connection/class-product-connection-resolver.php +++ b/includes/data/connection/class-product-connection-resolver.php @@ -22,9 +22,7 @@ use WPGraphQL\Model\Term; * Class Product_Connection_Resolver */ class Product_Connection_Resolver extends AbstractConnectionResolver { - use WC_Connection_Resolver { - sanitize_input_fields as sanitize_shared_input_fields; - } + use Common_CPT_Input_Sanitize_Functions; /** * The name of the post type, or array of post types the connection resolver is resolving for @@ -166,6 +164,11 @@ class Product_Connection_Resolver extends AbstractConnectionResolver { $query_args['graphql_cursor_offset'] = $cursor_offset; $query_args['graphql_cursor_compare'] = ( ! empty( $last ) ) ? '>' : '<'; + /** + * Pass the graphql $args to the WP_Query + */ + $query_args['graphql_args'] = $this->args; + // Determine where we're at in the Graph and adjust the query context appropriately. if ( true === is_object( $this->source ) ) { switch ( true ) { @@ -244,11 +247,6 @@ class Product_Connection_Resolver extends AbstractConnectionResolver { } } - /** - * Pass the graphql $args to the WP_Query - */ - $query_args['graphql_args'] = $this->args; - if ( isset( $query_args['post__in'] ) && empty( $query_args['post__in'] ) ) { $query_args['post__in'] = array( '0' ); } @@ -331,6 +329,24 @@ class Product_Connection_Resolver extends AbstractConnectionResolver { return ! empty( $this->query->posts ) ? $this->query->posts : array(); } + /** + * Returns meta keys to be used for connection ordering. + * + * @return array + */ + public function ordering_meta() { + return array( + '_price', + '_regular_price', + '_sale_price', + '_wc_rating_count', + '_wc_average_rating', + '_sale_price_dates_from', + '_sale_price_dates_to', + 'total_sales', + ); + } + /** * This sets up the "allowed" args, and translates the GraphQL-friendly keys to WP_Query * friendly keys. There's probably a cleaner/more dynamic way to approach this, but @@ -342,7 +358,7 @@ class Product_Connection_Resolver extends AbstractConnectionResolver { * @return array */ public function sanitize_input_fields( array $where_args ) { - $args = $this->sanitize_shared_input_fields( $where_args ); + $args = $this->sanitize_common_inputs( $where_args ); if ( ! empty( $where_args['slug'] ) ) { $args['name'] = $where_args['slug']; diff --git a/includes/data/connection/class-refund-connection-resolver.php b/includes/data/connection/class-refund-connection-resolver.php index da493642..e246a87b 100644 --- a/includes/data/connection/class-refund-connection-resolver.php +++ b/includes/data/connection/class-refund-connection-resolver.php @@ -20,9 +20,7 @@ use WPGraphQL\Extension\WooCommerce\Model\Order; * Class Refund_Connection_Resolver */ class Refund_Connection_Resolver extends AbstractConnectionResolver { - use WC_Connection_Resolver { - sanitize_input_fields as sanitize_shared_input_fields; - } + use Common_CPT_Input_Sanitize_Functions; /** * The name of the post type, or array of post types the connection resolver is resolving for @@ -177,6 +175,15 @@ class Refund_Connection_Resolver extends AbstractConnectionResolver { return ! empty( $this->query->get_orders() ) ? $this->query->get_orders() : array(); } + /** + * Returns meta keys to be used for connection ordering. + * + * @return array + */ + public function ordering_meta() { + return array(); + } + /** * This sets up the "allowed" args, and translates the GraphQL-friendly keys to WP_Query * friendly keys. There's probably a cleaner/more dynamic way to approach this, but @@ -188,7 +195,7 @@ class Refund_Connection_Resolver extends AbstractConnectionResolver { * @return array */ public function sanitize_input_fields( array $where_args ) { - $args = $this->sanitize_shared_input_fields( $where_args ); + $args = $this->sanitize_common_inputs( $where_args ); $key_mapping = array( 'post_parent' => 'parent', diff --git a/includes/data/connection/trait-common-cpt-args-processing.php b/includes/data/connection/trait-common-cpt-args-processing.php new file mode 100644 index 00000000..96f4238e --- /dev/null +++ b/includes/data/connection/trait-common-cpt-args-processing.php @@ -0,0 +1,87 @@ +ordering_meta(), true ) ) { + $args['orderby'] = array( 'meta_value_num' => $orderby_input['order'] ); + $args['meta_key'] = esc_sql( $orderby_input['field'] ); // WPCS: slow query ok. + + // Handle post object fields. + } elseif ( ! empty( $orderby_input['field'] ) ) { + $args['orderby'] = array( + esc_sql( $orderby_input['field'] ) => esc_sql( $orderby_input['order'] ), + ); + } + } + } + + if ( ! empty( $input['dateQuery'] ) ) { + $args['date_query'] = $input['dateQuery']; + } + + return $args; + } +} diff --git a/includes/data/connection/trait-wc-connection-resolver.php b/includes/data/connection/trait-wc-connection-resolver.php deleted file mode 100644 index 820a3c11..00000000 --- a/includes/data/connection/trait-wc-connection-resolver.php +++ /dev/null @@ -1,92 +0,0 @@ - $orderby_input['order'] ); - $args['meta_key'] = esc_sql( $orderby_input['field'] ); // WPCS: slow query ok. - } elseif ( ! empty( $orderby_input['field'] ) ) { - $args['orderby'] = array( - esc_sql( $orderby_input['field'] ) => esc_sql( $orderby_input['order'] ), - ); - } - } - } - - if ( ! empty( $where_args['dateQuery'] ) ) { - $args['date_query'] = $where_args['dateQuery']; - } - - return $args; - } -} diff --git a/includes/type/enum/class-orders-orderby-enum.php b/includes/type/enum/class-orders-orderby-enum.php new file mode 100644 index 00000000..f3972ea2 --- /dev/null +++ b/includes/type/enum/class-orders-orderby-enum.php @@ -0,0 +1,58 @@ + array( + 'value' => '_order_key', + 'description' => __( 'Order by order key', 'wp-graphql-woocommerce' ), + ), + 'DISCOUNT' => array( + 'value' => '_cart_discount', + 'description' => __( 'Order by order discount amount', 'wp-graphql-woocommerce' ), + ), + 'TOTAL' => array( + 'value' => '_order_total', + 'description' => __( 'Order by order total', 'wp-graphql-woocommerce' ), + ), + 'TAX' => array( + 'value' => '_order_tax', + 'description' => __( 'Order by order total', 'wp-graphql-woocommerce' ), + ), + 'DATE_PAID' => array( + 'value' => '_date_paid', + 'description' => __( 'Order by date the order was paid', 'wp-graphql-woocommerce' ), + ), + 'DATE_COMPLETED' => array( + 'value' => '_date_completed', + 'description' => __( 'Order by date the order was completed', 'wp-graphql-woocommerce' ), + ), + ) + ); + } +} diff --git a/includes/type/enum/class-post-type-orderby-enum.php b/includes/type/enum/class-post-type-orderby-enum.php new file mode 100644 index 00000000..814905d5 --- /dev/null +++ b/includes/type/enum/class-post-type-orderby-enum.php @@ -0,0 +1,87 @@ + array( + 'value' => 'post_name', + 'description' => __( 'Order by slug', 'wp-graphql-woocommerce' ), + ), + 'MODIFIED' => array( + 'value' => 'post_modified', + 'description' => __( 'Order by last modified date', 'wp-graphql-woocommerce' ), + ), + 'DATE' => array( + 'value' => 'post_date', + 'description' => __( 'Order by publish date', 'wp-graphql-woocommerce' ), + ), + 'PARENT' => array( + 'value' => 'post_parent', + 'description' => __( 'Order by parent ID', 'wp-graphql-woocommerce' ), + ), + 'IN' => array( + 'value' => 'post__in', + 'description' => __( 'Preserve the ID order given in the IN array', 'wp-graphql-woocommerce' ), + ), + 'NAME_IN' => array( + 'value' => 'post_name__in', + 'description' => __( 'Preserve slug order given in the NAME_IN array', 'wp-graphql-woocommerce' ), + ), + 'MENU_ORDER' => array( + 'value' => 'menu_order', + 'description' => __( 'Order by the menu order value', 'wp-graphql-woocommerce' ), + ), + ); + } + + /** + * Return enumeration values. + * + * @array + */ + protected static function values() { + return self::post_type_values(); + } + + /** + * Registers type + */ + public static function register() { + $name = static::$name; + register_graphql_enum_type( + $name . 'OrderByEnum', + array( + 'description' => sprintf( + /* translators: ordering enumeration description */ + __( 'Fields to order the %s connection by', 'wp-graphql-woocommerce' ), + $name + ), + 'values' => apply_filters( "{$name}_orderby_enum_values", static::values() ), + ) + ); + } +} diff --git a/includes/type/enum/class-products-orderby-enum.php b/includes/type/enum/class-products-orderby-enum.php new file mode 100644 index 00000000..729cf623 --- /dev/null +++ b/includes/type/enum/class-products-orderby-enum.php @@ -0,0 +1,66 @@ + array( + 'value' => '_price', + 'description' => __( 'Order by product\'s current price', 'wp-graphql-woocommerce' ), + ), + 'REGULAR_PRICE' => array( + 'value' => '_regular_price', + 'description' => __( 'Order by product\'s regular price', 'wp-graphql-woocommerce' ), + ), + 'SALE_PRICE' => array( + 'value' => '_sale_price', + 'description' => __( 'Order by product\'s sale price', 'wp-graphql-woocommerce' ), + ), + 'REVIEW_COUNT' => array( + 'value' => '_wc_rating_count', + 'description' => __( 'Order by number of reviews on product', 'wp-graphql-woocommerce' ), + ), + 'RATING' => array( + 'value' => '_wc_average_rating', + 'description' => __( 'Order by product average rating', 'wp-graphql-woocommerce' ), + ), + 'ON_SALE_FROM' => array( + 'value' => '_sale_price_dates_from', + 'description' => __( 'Order by date product sale starts', 'wp-graphql-woocommerce' ), + ), + 'ON_SALE_TO' => array( + 'value' => '_sale_price_dates_to', + 'description' => __( 'Order by date product sale ends', 'wp-graphql-woocommerce' ), + ), + 'TOTAL_SALES' => array( + 'value' => 'total_sales', + 'description' => __( 'Order by total sales of products sold', 'wp-graphql-woocommerce' ), + ), + ) + ); + } +} diff --git a/includes/type/enum/class-wc-connection-orderby-enum.php b/includes/type/enum/class-wc-connection-orderby-enum.php deleted file mode 100644 index af0c24de..00000000 --- a/includes/type/enum/class-wc-connection-orderby-enum.php +++ /dev/null @@ -1,68 +0,0 @@ - __( 'Field to order the connection by', 'wp-graphql-woocommerce' ), - 'values' => array( - 'SLUG' => array( - 'value' => 'post_name', - 'description' => __( 'Order by slug', 'wp-graphql-woocommerce' ), - ), - 'MODIFIED' => array( - 'value' => 'post_modified', - 'description' => __( 'Order by last modified date', 'wp-graphql-woocommerce' ), - ), - 'DATE' => array( - 'value' => 'post_date', - 'description' => __( 'Order by publish date', 'wp-graphql-woocommerce' ), - ), - 'PARENT' => array( - 'value' => 'post_parent', - 'description' => __( 'Order by parent ID', 'wp-graphql-woocommerce' ), - ), - 'IN' => array( - 'value' => 'post__in', - 'description' => __( 'Preserve the ID order given in the IN array', 'wp-graphql-woocommerce' ), - ), - 'NAME_IN' => array( - 'value' => 'post_name__in', - 'description' => __( 'Preserve slug order given in the NAME_IN array', 'wp-graphql-woocommerce' ), - ), - 'MENU_ORDER' => array( - 'value' => 'menu_order', - 'description' => __( 'Order by the menu order value', 'wp-graphql-woocommerce' ), - ), - 'PRICE' => array( - 'value' => '_price', - 'description' => __( 'Order by the menu order value', 'wp-graphql-woocommerce' ), - ), - 'REGULAR_PRICE' => array( - 'value' => '_regular_price', - 'description' => __( 'Order by the menu order value', 'wp-graphql-woocommerce' ), - ), - 'SALE_PRICE' => array( - 'value' => '_sale_price', - 'description' => __( 'Order by the menu order value', 'wp-graphql-woocommerce' ), - ), - ), - ) - ); - } -} diff --git a/includes/type/input/class-orderby-inputs.php b/includes/type/input/class-orderby-inputs.php new file mode 100644 index 00000000..3434ff09 --- /dev/null +++ b/includes/type/input/class-orderby-inputs.php @@ -0,0 +1,56 @@ + __( 'Options for ordering the connection', 'wp-graphql-woocommerce' ), + 'fields' => array( + 'field' => array( + 'type' => array( 'non_null' => $base_name . 'OrderbyEnum' ), + ), + 'order' => array( + 'type' => 'OrderEnum', + ), + ), + ) + ); + } + + /** + * Registers type + */ + public static function register() { + $input_types = array( + 'PostType', + 'Products', + 'Orders', + ); + + foreach ( $input_types as $name ) { + self::register_orderby_input( $name ); + } + } +} + diff --git a/includes/type/input/class-wc-connection-orderby-input.php b/includes/type/input/class-wc-connection-orderby-input.php deleted file mode 100644 index 9066594c..00000000 --- a/includes/type/input/class-wc-connection-orderby-input.php +++ /dev/null @@ -1,35 +0,0 @@ - __( 'Options for ordering the connection', 'wp-graphql-woocommerce' ), - 'fields' => array( - 'field' => array( - 'type' => array( 'non_null' => 'WCConnectionOrderbyEnum' ), - ), - 'order' => array( - 'type' => 'OrderEnum', - ), - ), - ) - ); - } -} - diff --git a/tests/wpunit/ProductQueriesTest.php b/tests/wpunit/ProductQueriesTest.php index fc579639..74c492db 100644 --- a/tests/wpunit/ProductQueriesTest.php +++ b/tests/wpunit/ProductQueriesTest.php @@ -259,7 +259,7 @@ class ProductQueriesTest extends \Codeception\TestCase\WPTestCase { $typeNotIn: [ProductTypesEnum], $featured: Boolean, $maxPrice: Float, - $orderby: [WCConnectionOrderbyInput] + $orderby: [ProductsOrderbyInput] $taxonomyFilter: [ProductTaxonomyFilterRelationInput] ){ products( where: { diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index 7c137f51..48dbc9b7 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -19,10 +19,10 @@ return array( 'WPGraphQL\\Extensions\\WooCommerce\\Connection\\Shipping_Methods' => $baseDir . '/includes/connection/class-shipping-methods.php', 'WPGraphQL\\Extensions\\WooCommerce\\Connection\\Tax_Rates' => $baseDir . '/includes/connection/class-tax-rates.php', 'WPGraphQL\\Extensions\\WooCommerce\\Connection\\Variation_Attributes' => $baseDir . '/includes/connection/class-variation-attributes.php', - 'WPGraphQL\\Extensions\\WooCommerce\\Connection\\WC_Connection' => $baseDir . '/includes/connection/class-wc-connection.php', 'WPGraphQL\\Extensions\\WooCommerce\\Connection\\WC_Terms' => $baseDir . '/includes/connection/class-wc-terms.php', 'WPGraphQL\\Extensions\\WooCommerce\\Core_Schema_Filters' => $baseDir . '/includes/class-core-schema-filters.php', 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Connection\\Cart_Item_Connection_Resolver' => $baseDir . '/includes/data/connection/class-cart-item-connection-resolver.php', + 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Connection\\Common_CPT_Input_Sanitize_Functions' => $baseDir . '/includes/data/connection/trait-common-cpt-args-processing.php', 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Connection\\Coupon_Connection_Resolver' => $baseDir . '/includes/data/connection/class-coupon-connection-resolver.php', 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Connection\\Customer_Connection_Resolver' => $baseDir . '/includes/data/connection/class-customer-connection-resolver.php', 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Connection\\Order_Connection_Resolver' => $baseDir . '/includes/data/connection/class-order-connection-resolver.php', @@ -35,7 +35,6 @@ return array( 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Connection\\Shipping_Method_Connection_Resolver' => $baseDir . '/includes/data/connection/class-shipping-method-connection-resolver.php', 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Connection\\Tax_Rate_Connection_Resolver' => $baseDir . '/includes/data/connection/class-tax-rate-connection-resolver.php', 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Connection\\Variation_Attribute_Connection_Resolver' => $baseDir . '/includes/data/connection/class-variation-attribute-connection-resolver.php', - 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Connection\\WC_Connection_Resolver' => $baseDir . '/includes/data/connection/trait-wc-connection-resolver.php', 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Connection\\WC_Terms_Connection_Resolver' => $baseDir . '/includes/data/connection/class-wc-terms-connection-resolver.php', 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Factory' => $baseDir . '/includes/data/class-factory.php', 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Loader\\WC_Customer_Loader' => $baseDir . '/includes/data/loader/class-wc-customer-loader.php', @@ -77,27 +76,29 @@ return array( 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Discount_Type' => $baseDir . '/includes/type/enum/class-discount-type.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Manage_Stock' => $baseDir . '/includes/type/enum/class-manage-stock.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Order_Status' => $baseDir . '/includes/type/enum/class-order-status.php', + 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Orders_Orderby_Enum' => $baseDir . '/includes/type/enum/class-orders-orderby-enum.php', + 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Post_Type_Orderby_Enum' => $baseDir . '/includes/type/enum/class-post-type-orderby-enum.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Pricing_Field_Format' => $baseDir . '/includes/type/enum/class-pricing-field-format.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Product_Taxonomy' => $baseDir . '/includes/type/enum/class-product-taxonomy.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Product_Types' => $baseDir . '/includes/type/enum/class-product-types.php', + 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Products_Orderby_Enum' => $baseDir . '/includes/type/enum/class-products-orderby-enum.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Stock_Status' => $baseDir . '/includes/type/enum/class-stock-status.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Tax_Class' => $baseDir . '/includes/type/enum/class-tax-class.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Tax_Rate_Connection_Orderby_Enum' => $baseDir . '/includes/type/enum/class-tax-rate-connection-orderby-enum.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Tax_Status' => $baseDir . '/includes/type/enum/class-tax-status.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Taxonomy_Operator' => $baseDir . '/includes/type/enum/class-taxonomy-operator.php', - 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\WC_Connection_Orderby_Enum' => $baseDir . '/includes/type/enum/class-wc-connection-orderby-enum.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Cart_Item_Quantity_Input' => $baseDir . '/includes/type/input/class-cart-item-quantity-input.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Create_Account_Input' => $baseDir . '/includes/type/input/class-create-account-input.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Customer_Address_Input' => $baseDir . '/includes/type/input/class-customer-address-input.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Fee_Line_Input' => $baseDir . '/includes/type/input/class-fee-line-input.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Line_Item_Input' => $baseDir . '/includes/type/input/class-line-item-input.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Meta_Data_Input' => $baseDir . '/includes/type/input/class-meta-data-input.php', + 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Orderby_Inputs' => $baseDir . '/includes/type/input/class-orderby-inputs.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Product_Attribute_Input' => $baseDir . '/includes/type/input/class-product-attribute-input.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Product_Taxonomy_Filter_Input' => $baseDir . '/includes/type/input/class-product-taxonomy-filter-input.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Product_Taxonomy_Filter_Relation_Input' => $baseDir . '/includes/type/input/class-product-taxonomy-filter-relation-input.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Shipping_Line_Input' => $baseDir . '/includes/type/input/class-shipping-line-input.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Tax_Rate_Connection_Orderby_Input' => $baseDir . '/includes/type/input/class-tax-rate-connection-orderby-input.php', - 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\WC_Connection_Orderby_Input' => $baseDir . '/includes/type/input/class-wc-connection-orderby-input.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPObject\\Cart_Type' => $baseDir . '/includes/type/object/class-cart-type.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPObject\\Coupon_Type' => $baseDir . '/includes/type/object/class-coupon-type.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPObject\\Customer_Address_Type' => $baseDir . '/includes/type/object/class-customer-address-type.php', diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php new file mode 100644 index 00000000..707366f2 --- /dev/null +++ b/vendor/composer/autoload_files.php @@ -0,0 +1,10 @@ + $baseDir . '/includes/connection/common-post-type-args.php', +); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index 1fcf5e90..76f40a4f 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -47,6 +47,24 @@ class ComposerAutoloaderInit47658c4b7d8904b82de7ca7f79505649 $loader->register(true); + if ($useStaticLoader) { + $includeFiles = Composer\Autoload\ComposerStaticInit47658c4b7d8904b82de7ca7f79505649::$files; + } else { + $includeFiles = require __DIR__ . '/autoload_files.php'; + } + foreach ($includeFiles as $fileIdentifier => $file) { + composerRequire47658c4b7d8904b82de7ca7f79505649($fileIdentifier, $file); + } + return $loader; } } + +function composerRequire47658c4b7d8904b82de7ca7f79505649($fileIdentifier, $file) +{ + if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { + require $file; + + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + } +} diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 5f1cce3b..d694cdb7 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -6,6 +6,10 @@ namespace Composer\Autoload; class ComposerStaticInit47658c4b7d8904b82de7ca7f79505649 { + public static $files = array ( + '914b07b8cf678ed0b81bfdb5d23b4f2b' => __DIR__ . '/../..' . '/includes/connection/common-post-type-args.php', + ); + public static $prefixLengthsPsr4 = array ( 'W' => array ( @@ -34,10 +38,10 @@ class ComposerStaticInit47658c4b7d8904b82de7ca7f79505649 'WPGraphQL\\Extensions\\WooCommerce\\Connection\\Shipping_Methods' => __DIR__ . '/../..' . '/includes/connection/class-shipping-methods.php', 'WPGraphQL\\Extensions\\WooCommerce\\Connection\\Tax_Rates' => __DIR__ . '/../..' . '/includes/connection/class-tax-rates.php', 'WPGraphQL\\Extensions\\WooCommerce\\Connection\\Variation_Attributes' => __DIR__ . '/../..' . '/includes/connection/class-variation-attributes.php', - 'WPGraphQL\\Extensions\\WooCommerce\\Connection\\WC_Connection' => __DIR__ . '/../..' . '/includes/connection/class-wc-connection.php', 'WPGraphQL\\Extensions\\WooCommerce\\Connection\\WC_Terms' => __DIR__ . '/../..' . '/includes/connection/class-wc-terms.php', 'WPGraphQL\\Extensions\\WooCommerce\\Core_Schema_Filters' => __DIR__ . '/../..' . '/includes/class-core-schema-filters.php', 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Connection\\Cart_Item_Connection_Resolver' => __DIR__ . '/../..' . '/includes/data/connection/class-cart-item-connection-resolver.php', + 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Connection\\Common_CPT_Input_Sanitize_Functions' => __DIR__ . '/../..' . '/includes/data/connection/trait-common-cpt-args-processing.php', 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Connection\\Coupon_Connection_Resolver' => __DIR__ . '/../..' . '/includes/data/connection/class-coupon-connection-resolver.php', 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Connection\\Customer_Connection_Resolver' => __DIR__ . '/../..' . '/includes/data/connection/class-customer-connection-resolver.php', 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Connection\\Order_Connection_Resolver' => __DIR__ . '/../..' . '/includes/data/connection/class-order-connection-resolver.php', @@ -50,7 +54,6 @@ class ComposerStaticInit47658c4b7d8904b82de7ca7f79505649 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Connection\\Shipping_Method_Connection_Resolver' => __DIR__ . '/../..' . '/includes/data/connection/class-shipping-method-connection-resolver.php', 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Connection\\Tax_Rate_Connection_Resolver' => __DIR__ . '/../..' . '/includes/data/connection/class-tax-rate-connection-resolver.php', 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Connection\\Variation_Attribute_Connection_Resolver' => __DIR__ . '/../..' . '/includes/data/connection/class-variation-attribute-connection-resolver.php', - 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Connection\\WC_Connection_Resolver' => __DIR__ . '/../..' . '/includes/data/connection/trait-wc-connection-resolver.php', 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Connection\\WC_Terms_Connection_Resolver' => __DIR__ . '/../..' . '/includes/data/connection/class-wc-terms-connection-resolver.php', 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Factory' => __DIR__ . '/../..' . '/includes/data/class-factory.php', 'WPGraphQL\\Extensions\\WooCommerce\\Data\\Loader\\WC_Customer_Loader' => __DIR__ . '/../..' . '/includes/data/loader/class-wc-customer-loader.php', @@ -92,27 +95,29 @@ class ComposerStaticInit47658c4b7d8904b82de7ca7f79505649 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Discount_Type' => __DIR__ . '/../..' . '/includes/type/enum/class-discount-type.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Manage_Stock' => __DIR__ . '/../..' . '/includes/type/enum/class-manage-stock.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Order_Status' => __DIR__ . '/../..' . '/includes/type/enum/class-order-status.php', + 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Orders_Orderby_Enum' => __DIR__ . '/../..' . '/includes/type/enum/class-orders-orderby-enum.php', + 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Post_Type_Orderby_Enum' => __DIR__ . '/../..' . '/includes/type/enum/class-post-type-orderby-enum.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Pricing_Field_Format' => __DIR__ . '/../..' . '/includes/type/enum/class-pricing-field-format.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Product_Taxonomy' => __DIR__ . '/../..' . '/includes/type/enum/class-product-taxonomy.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Product_Types' => __DIR__ . '/../..' . '/includes/type/enum/class-product-types.php', + 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Products_Orderby_Enum' => __DIR__ . '/../..' . '/includes/type/enum/class-products-orderby-enum.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Stock_Status' => __DIR__ . '/../..' . '/includes/type/enum/class-stock-status.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Tax_Class' => __DIR__ . '/../..' . '/includes/type/enum/class-tax-class.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Tax_Rate_Connection_Orderby_Enum' => __DIR__ . '/../..' . '/includes/type/enum/class-tax-rate-connection-orderby-enum.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Tax_Status' => __DIR__ . '/../..' . '/includes/type/enum/class-tax-status.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Taxonomy_Operator' => __DIR__ . '/../..' . '/includes/type/enum/class-taxonomy-operator.php', - 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\WC_Connection_Orderby_Enum' => __DIR__ . '/../..' . '/includes/type/enum/class-wc-connection-orderby-enum.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Cart_Item_Quantity_Input' => __DIR__ . '/../..' . '/includes/type/input/class-cart-item-quantity-input.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Create_Account_Input' => __DIR__ . '/../..' . '/includes/type/input/class-create-account-input.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Customer_Address_Input' => __DIR__ . '/../..' . '/includes/type/input/class-customer-address-input.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Fee_Line_Input' => __DIR__ . '/../..' . '/includes/type/input/class-fee-line-input.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Line_Item_Input' => __DIR__ . '/../..' . '/includes/type/input/class-line-item-input.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Meta_Data_Input' => __DIR__ . '/../..' . '/includes/type/input/class-meta-data-input.php', + 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Orderby_Inputs' => __DIR__ . '/../..' . '/includes/type/input/class-orderby-inputs.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Product_Attribute_Input' => __DIR__ . '/../..' . '/includes/type/input/class-product-attribute-input.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Product_Taxonomy_Filter_Input' => __DIR__ . '/../..' . '/includes/type/input/class-product-taxonomy-filter-input.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Product_Taxonomy_Filter_Relation_Input' => __DIR__ . '/../..' . '/includes/type/input/class-product-taxonomy-filter-relation-input.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Shipping_Line_Input' => __DIR__ . '/../..' . '/includes/type/input/class-shipping-line-input.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\Tax_Rate_Connection_Orderby_Input' => __DIR__ . '/../..' . '/includes/type/input/class-tax-rate-connection-orderby-input.php', - 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPInputObject\\WC_Connection_Orderby_Input' => __DIR__ . '/../..' . '/includes/type/input/class-wc-connection-orderby-input.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPObject\\Cart_Type' => __DIR__ . '/../..' . '/includes/type/object/class-cart-type.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPObject\\Coupon_Type' => __DIR__ . '/../..' . '/includes/type/object/class-coupon-type.php', 'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPObject\\Customer_Address_Type' => __DIR__ . '/../..' . '/includes/type/object/class-customer-address-type.php',